%% ranch_conns_sup is a custom supervisor (special process),
%% not an OTP supervisor. When "supervisor" is used, the
%% module is always loaded before calling system_code_change,
%% for both upgrade and downgrade operations. This is so that
%% the supervisor's init callback of the upgraded/downgraded
%% module gets called. But the custom supervisors in Ranch
%% do not have an init callback and therefore can function
%% like other special processes: when upgrading, load the
%% module then call system_code_change; and when downgrading,
%% call system_code_change and then load the module.

{"2.1.0",
	[{<<"2\\.0\\.[0-9]+.*">>, [
		{apply, {ranch, stop_all_acceptors, []}},
		{load_module, ranch},
		{load_module, ranch_acceptor},
		{update, ranch_acceptors_sup, supervisor},
		{load_module, ranch_app},
		{update, ranch_server, {advanced, []}},
		{update, ranch_conns_sup_sup, supervisor},
		%% See comments at the top of the file about ranch_conns_sup.
		{update, ranch_conns_sup, {advanced, []}},
		{load_module, ranch_crc32c},
		{update, ranch_embedded_sup, supervisor},
		{update, ranch_listener_sup, supervisor},
		{load_module, ranch_protocol},
		{load_module, ranch_proxy_header},
		{update, ranch_server_proxy, {advanced, []}},
		{load_module, ranch_ssl},
		{update, ranch_sup, supervisor},
		{load_module, ranch_tcp},
		{load_module, ranch_transport},
		{apply, {ranch, restart_all_acceptors, []}}
	]}],
	[{<<"2\\.0\\.[0-9]+.*">>, [
		{apply, {ranch, stop_all_acceptors, []}},
		{load_module, ranch},
		{load_module, ranch_acceptor},
		{update, ranch_acceptors_sup, supervisor},
		{load_module, ranch_app},
		%% See comments at the top of the file about ranch_conns_sup.
		{update, ranch_conns_sup, {advanced, []}},
		{update, ranch_conns_sup_sup, supervisor},
		{load_module, ranch_crc32c},
		{update, ranch_embedded_sup, supervisor},
		{update, ranch_listener_sup, supervisor},
		{load_module, ranch_protocol},
		{load_module, ranch_proxy_header},
		{update, ranch_server, {advanced, []}},
		{update, ranch_server_proxy, {advanced, []}},
		{load_module, ranch_ssl},
		{update, ranch_sup, supervisor},
		{load_module, ranch_tcp},
		{load_module, ranch_transport},
		{apply, {ranch, restart_all_acceptors, []}}
	]}]
}.

{"2.0.0",
	[{<<"2\\.0\\.[0-9]+.*">>, [
		{apply, {ranch, stop_all_acceptors, []}},
		{load_module, ranch},
		{load_module, ranch_acceptor},
		{update, ranch_acceptors_sup, supervisor},
		{load_module, ranch_app},
		{update, ranch_server, {advanced, []}},
		{update, ranch_conns_sup_sup, supervisor},
		%% See comments at the top of the file about ranch_conns_sup.
		{update, ranch_conns_sup, {advanced, []}},
		{load_module, ranch_crc32c},
		{update, ranch_embedded_sup, supervisor},
		{update, ranch_listener_sup, supervisor},
		{load_module, ranch_protocol},
		{load_module, ranch_proxy_header},
		{update, ranch_server_proxy, {advanced, []}},
		{load_module, ranch_ssl},
		{update, ranch_sup, supervisor},
		{load_module, ranch_tcp},
		{load_module, ranch_transport},
		{apply, {ranch, restart_all_acceptors, []}}
	]}],
	[{<<"2\\.0\\.[0-9]+.*">>, [
		{apply, {ranch, stop_all_acceptors, []}},
		{load_module, ranch},
		{load_module, ranch_acceptor},
		{update, ranch_acceptors_sup, supervisor},
		{load_module, ranch_app},
		%% See comments at the top of the file about ranch_conns_sup.
		{update, ranch_conns_sup, {advanced, []}},
		{update, ranch_conns_sup_sup, supervisor},
		{load_module, ranch_crc32c},
		{update, ranch_embedded_sup, supervisor},
		{update, ranch_listener_sup, supervisor},
		{load_module, ranch_protocol},
		{load_module, ranch_proxy_header},
		{update, ranch_server, {advanced, []}},
		{update, ranch_server_proxy, {advanced, []}},
		{load_module, ranch_ssl},
		{update, ranch_sup, supervisor},
		{load_module, ranch_tcp},
		{load_module, ranch_transport},
		{apply, {ranch, restart_all_acceptors, []}}
	]}]
}.
