From 6e011163d282b7cc06ec34d97c6577c3e6efe4ee Mon Sep 17 00:00:00 2001 From: Ivan Dyachkov Date: Wed, 17 Feb 2016 23:13:26 +0100 Subject: [PATCH] switch to erlang.mk xref not working out of the box havent't solved "platform define" yet --- .gitattributes | 1 + .gitignore | 15 +- Makefile | 53 +- cover.spec | 1 - erlang.mk | 6527 ++++++++++++++++++++++++++++++++++ rebar | Bin 202329 -> 0 bytes src/brod_consumer.erl | 4 +- src/brod_kafka.erl | 4 +- src/brod_kafka_requests.erl | 4 +- src/brod_producer_buffer.erl | 4 +- src/brod_utils.erl | 4 +- 11 files changed, 6558 insertions(+), 59 deletions(-) create mode 100644 .gitattributes delete mode 100644 cover.spec create mode 100644 erlang.mk delete mode 100755 rebar diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..9ad9fa04 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +erlang.mk -diff diff --git a/.gitignore b/.gitignore index a1e5dff5..980bf803 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,15 @@ doc/ erl_crash.dump -/.eunit/ -/.rebar/ /deps/ -logs/ +/logs/ ebin/ -*.beam +cover/ +test/*.beam +test/ct.cover.spec +brod.d scripts/brod -/brod.plt +.brod.plt +.erlang.mk +eunit.coverdata +sys.config +xrefr diff --git a/Makefile b/Makefile index 2bfe5b4e..988e848f 100644 --- a/Makefile +++ b/Makefile @@ -1,49 +1,16 @@ -.PHONY: all compile docs check test clean plt dialyze +PROJECT = brod +PROJECT_VERSION = 2.0-dev -REBAR ?= $(shell which rebar 2> /dev/null || which ./rebar) -DIALYZER_PLT = ./brod.plt -DIALYZER_OPTS = --fullpath --no_native -Werror_handling -Wrace_conditions -Wunderspecs -Wno_opaque -Wno_return -Wno_match -Wno_unused --plt $(DIALYZER_PLT) -PLT_APPS = erts kernel stdlib +DEPS = supervisor3 +TEST_DEPS = meck proper -all: compile +COVER = 1 -compile: - @$(REBAR) compile +EUNIT_OPTS = verbose +ERLC_OPTS = -Werror +warn_unused_vars +warn_shadow_vars +warn_unused_import +warn_obsolete_guard +CT_OPTS = -ct_use_short_names true -docs: - @$(REBAR) skip_deps=true doc +include erlang.mk -check: compile plt dialyze +ERL_LIBS := $(ERL_LIBS):$(CURDIR) -get-deps: - $(REBAR) get-deps - -test: REBAR := BROD_TEST=1 $(REBAR) -test: - $(REBAR) get-deps - $(REBAR) compile - $(REBAR) eunit -v apps=brod - $(REBAR) skip_deps=true ct - ./scripts/cover-summary.escript ./.eunit ./logs - -clean: - @$(RM) -rf deps - @$(REBAR) clean - @$(RM) doc/* - @$(RM) -f $(DIALYZER_PLT) - -plt: $(DIALYZER_PLT) - -$(DIALYZER_PLT): - dialyzer --build_plt --apps $(PLT_APPS) ebin deps/supervisor3/ebin --output_plt $(DIALYZER_PLT) - -dialyze: $(DIALYZER_PLT) - dialyzer -r ebin deps/supervisor3/ebin $(DIALYZER_OPTS) - -xref: compile - $(REBAR) xref - -escriptize: compile - @$(REBAR) escriptize - -# eof diff --git a/cover.spec b/cover.spec deleted file mode 100644 index 8b746f80..00000000 --- a/cover.spec +++ /dev/null @@ -1 +0,0 @@ -{incl_app, brod, details}. diff --git a/erlang.mk b/erlang.mk new file mode 100644 index 00000000..35d97b26 --- /dev/null +++ b/erlang.mk @@ -0,0 +1,6527 @@ +# Copyright (c) 2013-2015, Loïc Hoguin +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk + +ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST))) + +ERLANG_MK_VERSION = 2.0.0-pre.2-81-gbb6b9475 + +# Core configuration. + +PROJECT ?= $(notdir $(CURDIR)) +PROJECT := $(strip $(PROJECT)) + +PROJECT_VERSION ?= rolling + +# Verbosity. + +V ?= 0 + +verbose_0 = @ +verbose_2 = set -x; +verbose = $(verbose_$(V)) + +gen_verbose_0 = @echo " GEN " $@; +gen_verbose_2 = set -x; +gen_verbose = $(gen_verbose_$(V)) + +# Temporary files directory. + +ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk +export ERLANG_MK_TMP + +# "erl" command. + +ERL = erl +A0 -noinput -boot start_clean + +# Platform detection. + +ifeq ($(PLATFORM),) +UNAME_S := $(shell uname -s) + +ifeq ($(UNAME_S),Linux) +PLATFORM = linux +else ifeq ($(UNAME_S),Darwin) +PLATFORM = darwin +else ifeq ($(UNAME_S),SunOS) +PLATFORM = solaris +else ifeq ($(UNAME_S),GNU) +PLATFORM = gnu +else ifeq ($(UNAME_S),FreeBSD) +PLATFORM = freebsd +else ifeq ($(UNAME_S),NetBSD) +PLATFORM = netbsd +else ifeq ($(UNAME_S),OpenBSD) +PLATFORM = openbsd +else ifeq ($(UNAME_S),DragonFly) +PLATFORM = dragonfly +else ifeq ($(shell uname -o),Msys) +PLATFORM = msys2 +else +$(error Unable to detect platform. Please open a ticket with the output of uname -a.) +endif + +export PLATFORM +endif + +# Core targets. + +all:: deps app rel + +# Noop to avoid a Make warning when there's nothing to do. +rel:: + $(verbose) : + +check:: tests + +clean:: clean-crashdump + +clean-crashdump: +ifneq ($(wildcard erl_crash.dump),) + $(gen_verbose) rm -f erl_crash.dump +endif + +distclean:: clean distclean-tmp + +distclean-tmp: + $(gen_verbose) rm -rf $(ERLANG_MK_TMP) + +help:: + $(verbose) printf "%s\n" \ + "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \ + "Copyright (c) 2013-2015 Loïc Hoguin " \ + "" \ + "Usage: [V=1] $(MAKE) [target]..." \ + "" \ + "Core targets:" \ + " all Run deps, app and rel targets in that order" \ + " app Compile the project" \ + " deps Fetch dependencies (if needed) and compile them" \ + " search q=... Search for a package in the built-in index" \ + " rel Build a release for this project, if applicable" \ + " docs Build the documentation for this project" \ + " install-docs Install the man pages for this project" \ + " check Compile and run all tests and analysis for this project" \ + " tests Run the tests for this project" \ + " clean Delete temporary and output files from most targets" \ + " distclean Delete all temporary and output files" \ + " help Display this help and exit" \ + " erlang-mk Update erlang.mk to the latest version" + +# Core functions. + +empty := +space := $(empty) $(empty) +tab := $(empty) $(empty) +comma := , + +define newline + + +endef + +define comma_list +$(subst $(space),$(comma),$(strip $(1))) +endef + +# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy. +define erlang +$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk +endef + +ifeq ($(PLATFORM),msys2) +core_native_path = $(subst \,\\\\,$(shell cygpath -w $1)) +else +core_native_path = $1 +endif + +ifeq ($(shell which wget 2>/dev/null | wc -l), 1) +define core_http_get + wget --no-check-certificate -O $(1) $(2)|| rm $(1) +endef +else +define core_http_get.erl + ssl:start(), + inets:start(), + case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of + {ok, {{_, 200, _}, _, Body}} -> + case file:write_file("$(1)", Body) of + ok -> ok; + {error, R1} -> halt(R1) + end; + {error, R2} -> + halt(R2) + end, + halt(0). +endef + +define core_http_get + $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2)) +endef +endif + +core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) + +core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2))) + +core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1))))))))))))))))))))))))))) + +core_ls = $(filter-out $(1),$(shell echo $(1))) + +# @todo Use a solution that does not require using perl. +core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2) + +# Automated update. + +ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk +ERLANG_MK_COMMIT ?= +ERLANG_MK_BUILD_CONFIG ?= build.config +ERLANG_MK_BUILD_DIR ?= .erlang.mk.build + +erlang-mk: + git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR) +ifdef ERLANG_MK_COMMIT + cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT) +endif + if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi + $(MAKE) -C $(ERLANG_MK_BUILD_DIR) + cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk + rm -rf $(ERLANG_MK_BUILD_DIR) + +# The erlang.mk package index is bundled in the default erlang.mk build. +# Search for the string "copyright" to skip to the rest of the code. + +PACKAGES += aberth +pkg_aberth_name = aberth +pkg_aberth_description = Generic BERT-RPC server in Erlang +pkg_aberth_homepage = https://github.com/a13x/aberth +pkg_aberth_fetch = git +pkg_aberth_repo = https://github.com/a13x/aberth +pkg_aberth_commit = master + +PACKAGES += active +pkg_active_name = active +pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running +pkg_active_homepage = https://github.com/proger/active +pkg_active_fetch = git +pkg_active_repo = https://github.com/proger/active +pkg_active_commit = master + +PACKAGES += actordb_core +pkg_actordb_core_name = actordb_core +pkg_actordb_core_description = ActorDB main source +pkg_actordb_core_homepage = http://www.actordb.com/ +pkg_actordb_core_fetch = git +pkg_actordb_core_repo = https://github.com/biokoda/actordb_core +pkg_actordb_core_commit = master + +PACKAGES += actordb_thrift +pkg_actordb_thrift_name = actordb_thrift +pkg_actordb_thrift_description = Thrift API for ActorDB +pkg_actordb_thrift_homepage = http://www.actordb.com/ +pkg_actordb_thrift_fetch = git +pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift +pkg_actordb_thrift_commit = master + +PACKAGES += aleppo +pkg_aleppo_name = aleppo +pkg_aleppo_description = Alternative Erlang Pre-Processor +pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo +pkg_aleppo_fetch = git +pkg_aleppo_repo = https://github.com/ErlyORM/aleppo +pkg_aleppo_commit = master + +PACKAGES += alog +pkg_alog_name = alog +pkg_alog_description = Simply the best logging framework for Erlang +pkg_alog_homepage = https://github.com/siberian-fast-food/alogger +pkg_alog_fetch = git +pkg_alog_repo = https://github.com/siberian-fast-food/alogger +pkg_alog_commit = master + +PACKAGES += amqp_client +pkg_amqp_client_name = amqp_client +pkg_amqp_client_description = RabbitMQ Erlang AMQP client +pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html +pkg_amqp_client_fetch = git +pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git +pkg_amqp_client_commit = master + +PACKAGES += annotations +pkg_annotations_name = annotations +pkg_annotations_description = Simple code instrumentation utilities +pkg_annotations_homepage = https://github.com/hyperthunk/annotations +pkg_annotations_fetch = git +pkg_annotations_repo = https://github.com/hyperthunk/annotations +pkg_annotations_commit = master + +PACKAGES += antidote +pkg_antidote_name = antidote +pkg_antidote_description = Large-scale computation without synchronisation +pkg_antidote_homepage = https://syncfree.lip6.fr/ +pkg_antidote_fetch = git +pkg_antidote_repo = https://github.com/SyncFree/antidote +pkg_antidote_commit = master + +PACKAGES += apns +pkg_apns_name = apns +pkg_apns_description = Apple Push Notification Server for Erlang +pkg_apns_homepage = http://inaka.github.com/apns4erl +pkg_apns_fetch = git +pkg_apns_repo = https://github.com/inaka/apns4erl +pkg_apns_commit = 1.0.4 + +PACKAGES += azdht +pkg_azdht_name = azdht +pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang +pkg_azdht_homepage = https://github.com/arcusfelis/azdht +pkg_azdht_fetch = git +pkg_azdht_repo = https://github.com/arcusfelis/azdht +pkg_azdht_commit = master + +PACKAGES += backoff +pkg_backoff_name = backoff +pkg_backoff_description = Simple exponential backoffs in Erlang +pkg_backoff_homepage = https://github.com/ferd/backoff +pkg_backoff_fetch = git +pkg_backoff_repo = https://github.com/ferd/backoff +pkg_backoff_commit = master + +PACKAGES += barrel_tcp +pkg_barrel_tcp_name = barrel_tcp +pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang. +pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp +pkg_barrel_tcp_fetch = git +pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp +pkg_barrel_tcp_commit = master + +PACKAGES += basho_bench +pkg_basho_bench_name = basho_bench +pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for. +pkg_basho_bench_homepage = https://github.com/basho/basho_bench +pkg_basho_bench_fetch = git +pkg_basho_bench_repo = https://github.com/basho/basho_bench +pkg_basho_bench_commit = master + +PACKAGES += bcrypt +pkg_bcrypt_name = bcrypt +pkg_bcrypt_description = Bcrypt Erlang / C library +pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt +pkg_bcrypt_fetch = git +pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt +pkg_bcrypt_commit = master + +PACKAGES += beam +pkg_beam_name = beam +pkg_beam_description = BEAM emulator written in Erlang +pkg_beam_homepage = https://github.com/tonyrog/beam +pkg_beam_fetch = git +pkg_beam_repo = https://github.com/tonyrog/beam +pkg_beam_commit = master + +PACKAGES += beanstalk +pkg_beanstalk_name = beanstalk +pkg_beanstalk_description = An Erlang client for beanstalkd +pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk +pkg_beanstalk_fetch = git +pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk +pkg_beanstalk_commit = master + +PACKAGES += bear +pkg_bear_name = bear +pkg_bear_description = a set of statistics functions for erlang +pkg_bear_homepage = https://github.com/boundary/bear +pkg_bear_fetch = git +pkg_bear_repo = https://github.com/boundary/bear +pkg_bear_commit = master + +PACKAGES += bertconf +pkg_bertconf_name = bertconf +pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded +pkg_bertconf_homepage = https://github.com/ferd/bertconf +pkg_bertconf_fetch = git +pkg_bertconf_repo = https://github.com/ferd/bertconf +pkg_bertconf_commit = master + +PACKAGES += bifrost +pkg_bifrost_name = bifrost +pkg_bifrost_description = Erlang FTP Server Framework +pkg_bifrost_homepage = https://github.com/thorstadt/bifrost +pkg_bifrost_fetch = git +pkg_bifrost_repo = https://github.com/thorstadt/bifrost +pkg_bifrost_commit = master + +PACKAGES += binpp +pkg_binpp_name = binpp +pkg_binpp_description = Erlang Binary Pretty Printer +pkg_binpp_homepage = https://github.com/jtendo/binpp +pkg_binpp_fetch = git +pkg_binpp_repo = https://github.com/jtendo/binpp +pkg_binpp_commit = master + +PACKAGES += bisect +pkg_bisect_name = bisect +pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang +pkg_bisect_homepage = https://github.com/knutin/bisect +pkg_bisect_fetch = git +pkg_bisect_repo = https://github.com/knutin/bisect +pkg_bisect_commit = master + +PACKAGES += bitcask +pkg_bitcask_name = bitcask +pkg_bitcask_description = because you need another a key/value storage engine +pkg_bitcask_homepage = https://github.com/basho/bitcask +pkg_bitcask_fetch = git +pkg_bitcask_repo = https://github.com/basho/bitcask +pkg_bitcask_commit = master + +PACKAGES += bitstore +pkg_bitstore_name = bitstore +pkg_bitstore_description = A document based ontology development environment +pkg_bitstore_homepage = https://github.com/bdionne/bitstore +pkg_bitstore_fetch = git +pkg_bitstore_repo = https://github.com/bdionne/bitstore +pkg_bitstore_commit = master + +PACKAGES += bootstrap +pkg_bootstrap_name = bootstrap +pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application. +pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap +pkg_bootstrap_fetch = git +pkg_bootstrap_repo = https://github.com/schlagert/bootstrap +pkg_bootstrap_commit = master + +PACKAGES += boss_db +pkg_boss_db_name = boss_db +pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang +pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db +pkg_boss_db_fetch = git +pkg_boss_db_repo = https://github.com/ErlyORM/boss_db +pkg_boss_db_commit = master + +PACKAGES += boss +pkg_boss_name = boss +pkg_boss_description = Erlang web MVC, now featuring Comet +pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss +pkg_boss_fetch = git +pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss +pkg_boss_commit = master + +PACKAGES += brod +pkg_brod_name = brod +pkg_brod_description = Kafka client in Erlang +pkg_brod_homepage = https://github.com/klarna/brod +pkg_brod_fetch = git +pkg_brod_repo = https://github.com/klarna/brod.git +pkg_brod_commit = master + +PACKAGES += bson +pkg_bson_name = bson +pkg_bson_description = BSON documents in Erlang, see bsonspec.org +pkg_bson_homepage = https://github.com/comtihon/bson-erlang +pkg_bson_fetch = git +pkg_bson_repo = https://github.com/comtihon/bson-erlang +pkg_bson_commit = master + +PACKAGES += bullet +pkg_bullet_name = bullet +pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy. +pkg_bullet_homepage = http://ninenines.eu +pkg_bullet_fetch = git +pkg_bullet_repo = https://github.com/ninenines/bullet +pkg_bullet_commit = master + +PACKAGES += cache +pkg_cache_name = cache +pkg_cache_description = Erlang in-memory cache +pkg_cache_homepage = https://github.com/fogfish/cache +pkg_cache_fetch = git +pkg_cache_repo = https://github.com/fogfish/cache +pkg_cache_commit = master + +PACKAGES += cake +pkg_cake_name = cake +pkg_cake_description = Really simple terminal colorization +pkg_cake_homepage = https://github.com/darach/cake-erl +pkg_cake_fetch = git +pkg_cake_repo = https://github.com/darach/cake-erl +pkg_cake_commit = v0.1.2 + +PACKAGES += carotene +pkg_carotene_name = carotene +pkg_carotene_description = Real-time server +pkg_carotene_homepage = https://github.com/carotene/carotene +pkg_carotene_fetch = git +pkg_carotene_repo = https://github.com/carotene/carotene +pkg_carotene_commit = master + +PACKAGES += cberl +pkg_cberl_name = cberl +pkg_cberl_description = NIF based Erlang bindings for Couchbase +pkg_cberl_homepage = https://github.com/chitika/cberl +pkg_cberl_fetch = git +pkg_cberl_repo = https://github.com/chitika/cberl +pkg_cberl_commit = master + +PACKAGES += cecho +pkg_cecho_name = cecho +pkg_cecho_description = An ncurses library for Erlang +pkg_cecho_homepage = https://github.com/mazenharake/cecho +pkg_cecho_fetch = git +pkg_cecho_repo = https://github.com/mazenharake/cecho +pkg_cecho_commit = master + +PACKAGES += cferl +pkg_cferl_name = cferl +pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client +pkg_cferl_homepage = https://github.com/ddossot/cferl +pkg_cferl_fetch = git +pkg_cferl_repo = https://github.com/ddossot/cferl +pkg_cferl_commit = master + +PACKAGES += chaos_monkey +pkg_chaos_monkey_name = chaos_monkey +pkg_chaos_monkey_description = This is The CHAOS MONKEY. It will kill your processes. +pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey +pkg_chaos_monkey_fetch = git +pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey +pkg_chaos_monkey_commit = master + +PACKAGES += check_node +pkg_check_node_name = check_node +pkg_check_node_description = Nagios Scripts for monitoring Riak +pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios +pkg_check_node_fetch = git +pkg_check_node_repo = https://github.com/basho-labs/riak_nagios +pkg_check_node_commit = master + +PACKAGES += chronos +pkg_chronos_name = chronos +pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests. +pkg_chronos_homepage = https://github.com/lehoff/chronos +pkg_chronos_fetch = git +pkg_chronos_repo = https://github.com/lehoff/chronos +pkg_chronos_commit = master + +PACKAGES += classifier +pkg_classifier_name = classifier +pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier +pkg_classifier_homepage = https://github.com/inaka/classifier +pkg_classifier_fetch = git +pkg_classifier_repo = https://github.com/inaka/classifier +pkg_classifier_commit = master + +PACKAGES += clique +pkg_clique_name = clique +pkg_clique_description = CLI Framework for Erlang +pkg_clique_homepage = https://github.com/basho/clique +pkg_clique_fetch = git +pkg_clique_repo = https://github.com/basho/clique +pkg_clique_commit = develop + +PACKAGES += cl +pkg_cl_name = cl +pkg_cl_description = OpenCL binding for Erlang +pkg_cl_homepage = https://github.com/tonyrog/cl +pkg_cl_fetch = git +pkg_cl_repo = https://github.com/tonyrog/cl +pkg_cl_commit = master + +PACKAGES += cloudi_core +pkg_cloudi_core_name = cloudi_core +pkg_cloudi_core_description = CloudI internal service runtime +pkg_cloudi_core_homepage = http://cloudi.org/ +pkg_cloudi_core_fetch = git +pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core +pkg_cloudi_core_commit = master + +PACKAGES += cloudi_service_api_requests +pkg_cloudi_service_api_requests_name = cloudi_service_api_requests +pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support) +pkg_cloudi_service_api_requests_homepage = http://cloudi.org/ +pkg_cloudi_service_api_requests_fetch = git +pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests +pkg_cloudi_service_api_requests_commit = master + +PACKAGES += cloudi_service_db_cassandra_cql +pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql +pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service +pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/ +pkg_cloudi_service_db_cassandra_cql_fetch = git +pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql +pkg_cloudi_service_db_cassandra_cql_commit = master + +PACKAGES += cloudi_service_db_cassandra +pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra +pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service +pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/ +pkg_cloudi_service_db_cassandra_fetch = git +pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra +pkg_cloudi_service_db_cassandra_commit = master + +PACKAGES += cloudi_service_db_couchdb +pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb +pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service +pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/ +pkg_cloudi_service_db_couchdb_fetch = git +pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb +pkg_cloudi_service_db_couchdb_commit = master + +PACKAGES += cloudi_service_db_elasticsearch +pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch +pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service +pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/ +pkg_cloudi_service_db_elasticsearch_fetch = git +pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch +pkg_cloudi_service_db_elasticsearch_commit = master + +PACKAGES += cloudi_service_db_memcached +pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached +pkg_cloudi_service_db_memcached_description = memcached CloudI Service +pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/ +pkg_cloudi_service_db_memcached_fetch = git +pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached +pkg_cloudi_service_db_memcached_commit = master + +PACKAGES += cloudi_service_db +pkg_cloudi_service_db_name = cloudi_service_db +pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic) +pkg_cloudi_service_db_homepage = http://cloudi.org/ +pkg_cloudi_service_db_fetch = git +pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db +pkg_cloudi_service_db_commit = master + +PACKAGES += cloudi_service_db_mysql +pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql +pkg_cloudi_service_db_mysql_description = MySQL CloudI Service +pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/ +pkg_cloudi_service_db_mysql_fetch = git +pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql +pkg_cloudi_service_db_mysql_commit = master + +PACKAGES += cloudi_service_db_pgsql +pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql +pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service +pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/ +pkg_cloudi_service_db_pgsql_fetch = git +pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql +pkg_cloudi_service_db_pgsql_commit = master + +PACKAGES += cloudi_service_db_riak +pkg_cloudi_service_db_riak_name = cloudi_service_db_riak +pkg_cloudi_service_db_riak_description = Riak CloudI Service +pkg_cloudi_service_db_riak_homepage = http://cloudi.org/ +pkg_cloudi_service_db_riak_fetch = git +pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak +pkg_cloudi_service_db_riak_commit = master + +PACKAGES += cloudi_service_db_tokyotyrant +pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant +pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service +pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/ +pkg_cloudi_service_db_tokyotyrant_fetch = git +pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant +pkg_cloudi_service_db_tokyotyrant_commit = master + +PACKAGES += cloudi_service_filesystem +pkg_cloudi_service_filesystem_name = cloudi_service_filesystem +pkg_cloudi_service_filesystem_description = Filesystem CloudI Service +pkg_cloudi_service_filesystem_homepage = http://cloudi.org/ +pkg_cloudi_service_filesystem_fetch = git +pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem +pkg_cloudi_service_filesystem_commit = master + +PACKAGES += cloudi_service_http_client +pkg_cloudi_service_http_client_name = cloudi_service_http_client +pkg_cloudi_service_http_client_description = HTTP client CloudI Service +pkg_cloudi_service_http_client_homepage = http://cloudi.org/ +pkg_cloudi_service_http_client_fetch = git +pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client +pkg_cloudi_service_http_client_commit = master + +PACKAGES += cloudi_service_http_cowboy +pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy +pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service +pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/ +pkg_cloudi_service_http_cowboy_fetch = git +pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy +pkg_cloudi_service_http_cowboy_commit = master + +PACKAGES += cloudi_service_http_elli +pkg_cloudi_service_http_elli_name = cloudi_service_http_elli +pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service +pkg_cloudi_service_http_elli_homepage = http://cloudi.org/ +pkg_cloudi_service_http_elli_fetch = git +pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli +pkg_cloudi_service_http_elli_commit = master + +PACKAGES += cloudi_service_map_reduce +pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce +pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service +pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/ +pkg_cloudi_service_map_reduce_fetch = git +pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce +pkg_cloudi_service_map_reduce_commit = master + +PACKAGES += cloudi_service_oauth1 +pkg_cloudi_service_oauth1_name = cloudi_service_oauth1 +pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service +pkg_cloudi_service_oauth1_homepage = http://cloudi.org/ +pkg_cloudi_service_oauth1_fetch = git +pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1 +pkg_cloudi_service_oauth1_commit = master + +PACKAGES += cloudi_service_queue +pkg_cloudi_service_queue_name = cloudi_service_queue +pkg_cloudi_service_queue_description = Persistent Queue Service +pkg_cloudi_service_queue_homepage = http://cloudi.org/ +pkg_cloudi_service_queue_fetch = git +pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue +pkg_cloudi_service_queue_commit = master + +PACKAGES += cloudi_service_quorum +pkg_cloudi_service_quorum_name = cloudi_service_quorum +pkg_cloudi_service_quorum_description = CloudI Quorum Service +pkg_cloudi_service_quorum_homepage = http://cloudi.org/ +pkg_cloudi_service_quorum_fetch = git +pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum +pkg_cloudi_service_quorum_commit = master + +PACKAGES += cloudi_service_router +pkg_cloudi_service_router_name = cloudi_service_router +pkg_cloudi_service_router_description = CloudI Router Service +pkg_cloudi_service_router_homepage = http://cloudi.org/ +pkg_cloudi_service_router_fetch = git +pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router +pkg_cloudi_service_router_commit = master + +PACKAGES += cloudi_service_tcp +pkg_cloudi_service_tcp_name = cloudi_service_tcp +pkg_cloudi_service_tcp_description = TCP CloudI Service +pkg_cloudi_service_tcp_homepage = http://cloudi.org/ +pkg_cloudi_service_tcp_fetch = git +pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp +pkg_cloudi_service_tcp_commit = master + +PACKAGES += cloudi_service_timers +pkg_cloudi_service_timers_name = cloudi_service_timers +pkg_cloudi_service_timers_description = Timers CloudI Service +pkg_cloudi_service_timers_homepage = http://cloudi.org/ +pkg_cloudi_service_timers_fetch = git +pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers +pkg_cloudi_service_timers_commit = master + +PACKAGES += cloudi_service_udp +pkg_cloudi_service_udp_name = cloudi_service_udp +pkg_cloudi_service_udp_description = UDP CloudI Service +pkg_cloudi_service_udp_homepage = http://cloudi.org/ +pkg_cloudi_service_udp_fetch = git +pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp +pkg_cloudi_service_udp_commit = master + +PACKAGES += cloudi_service_validate +pkg_cloudi_service_validate_name = cloudi_service_validate +pkg_cloudi_service_validate_description = CloudI Validate Service +pkg_cloudi_service_validate_homepage = http://cloudi.org/ +pkg_cloudi_service_validate_fetch = git +pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate +pkg_cloudi_service_validate_commit = master + +PACKAGES += cloudi_service_zeromq +pkg_cloudi_service_zeromq_name = cloudi_service_zeromq +pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service +pkg_cloudi_service_zeromq_homepage = http://cloudi.org/ +pkg_cloudi_service_zeromq_fetch = git +pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq +pkg_cloudi_service_zeromq_commit = master + +PACKAGES += cluster_info +pkg_cluster_info_name = cluster_info +pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app +pkg_cluster_info_homepage = https://github.com/basho/cluster_info +pkg_cluster_info_fetch = git +pkg_cluster_info_repo = https://github.com/basho/cluster_info +pkg_cluster_info_commit = master + +PACKAGES += color +pkg_color_name = color +pkg_color_description = ANSI colors for your Erlang +pkg_color_homepage = https://github.com/julianduque/erlang-color +pkg_color_fetch = git +pkg_color_repo = https://github.com/julianduque/erlang-color +pkg_color_commit = master + +PACKAGES += confetti +pkg_confetti_name = confetti +pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids +pkg_confetti_homepage = https://github.com/jtendo/confetti +pkg_confetti_fetch = git +pkg_confetti_repo = https://github.com/jtendo/confetti +pkg_confetti_commit = master + +PACKAGES += couchbeam +pkg_couchbeam_name = couchbeam +pkg_couchbeam_description = Apache CouchDB client in Erlang +pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam +pkg_couchbeam_fetch = git +pkg_couchbeam_repo = https://github.com/benoitc/couchbeam +pkg_couchbeam_commit = master + +PACKAGES += covertool +pkg_covertool_name = covertool +pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports +pkg_covertool_homepage = https://github.com/idubrov/covertool +pkg_covertool_fetch = git +pkg_covertool_repo = https://github.com/idubrov/covertool +pkg_covertool_commit = master + +PACKAGES += cowboy +pkg_cowboy_name = cowboy +pkg_cowboy_description = Small, fast and modular HTTP server. +pkg_cowboy_homepage = http://ninenines.eu +pkg_cowboy_fetch = git +pkg_cowboy_repo = https://github.com/ninenines/cowboy +pkg_cowboy_commit = 1.0.1 + +PACKAGES += cowdb +pkg_cowdb_name = cowdb +pkg_cowdb_description = Pure Key/Value database library for Erlang Applications +pkg_cowdb_homepage = https://github.com/refuge/cowdb +pkg_cowdb_fetch = git +pkg_cowdb_repo = https://github.com/refuge/cowdb +pkg_cowdb_commit = master + +PACKAGES += cowlib +pkg_cowlib_name = cowlib +pkg_cowlib_description = Support library for manipulating Web protocols. +pkg_cowlib_homepage = http://ninenines.eu +pkg_cowlib_fetch = git +pkg_cowlib_repo = https://github.com/ninenines/cowlib +pkg_cowlib_commit = 1.0.1 + +PACKAGES += cpg +pkg_cpg_name = cpg +pkg_cpg_description = CloudI Process Groups +pkg_cpg_homepage = https://github.com/okeuday/cpg +pkg_cpg_fetch = git +pkg_cpg_repo = https://github.com/okeuday/cpg +pkg_cpg_commit = master + +PACKAGES += cqerl +pkg_cqerl_name = cqerl +pkg_cqerl_description = Native Erlang CQL client for Cassandra +pkg_cqerl_homepage = https://matehat.github.io/cqerl/ +pkg_cqerl_fetch = git +pkg_cqerl_repo = https://github.com/matehat/cqerl +pkg_cqerl_commit = master + +PACKAGES += cr +pkg_cr_name = cr +pkg_cr_description = Chain Replication +pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm +pkg_cr_fetch = git +pkg_cr_repo = https://github.com/spawnproc/cr +pkg_cr_commit = master + +PACKAGES += cuttlefish +pkg_cuttlefish_name = cuttlefish +pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me? +pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish +pkg_cuttlefish_fetch = git +pkg_cuttlefish_repo = https://github.com/basho/cuttlefish +pkg_cuttlefish_commit = master + +PACKAGES += damocles +pkg_damocles_name = damocles +pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box. +pkg_damocles_homepage = https://github.com/lostcolony/damocles +pkg_damocles_fetch = git +pkg_damocles_repo = https://github.com/lostcolony/damocles +pkg_damocles_commit = master + +PACKAGES += debbie +pkg_debbie_name = debbie +pkg_debbie_description = .DEB Built In Erlang +pkg_debbie_homepage = https://github.com/crownedgrouse/debbie +pkg_debbie_fetch = git +pkg_debbie_repo = https://github.com/crownedgrouse/debbie +pkg_debbie_commit = master + +PACKAGES += decimal +pkg_decimal_name = decimal +pkg_decimal_description = An Erlang decimal arithmetic library +pkg_decimal_homepage = https://github.com/tim/erlang-decimal +pkg_decimal_fetch = git +pkg_decimal_repo = https://github.com/tim/erlang-decimal +pkg_decimal_commit = master + +PACKAGES += detergent +pkg_detergent_name = detergent +pkg_detergent_description = An emulsifying Erlang SOAP library +pkg_detergent_homepage = https://github.com/devinus/detergent +pkg_detergent_fetch = git +pkg_detergent_repo = https://github.com/devinus/detergent +pkg_detergent_commit = master + +PACKAGES += detest +pkg_detest_name = detest +pkg_detest_description = Tool for running tests on a cluster of erlang nodes +pkg_detest_homepage = https://github.com/biokoda/detest +pkg_detest_fetch = git +pkg_detest_repo = https://github.com/biokoda/detest +pkg_detest_commit = master + +PACKAGES += dh_date +pkg_dh_date_name = dh_date +pkg_dh_date_description = Date formatting / parsing library for erlang +pkg_dh_date_homepage = https://github.com/daleharvey/dh_date +pkg_dh_date_fetch = git +pkg_dh_date_repo = https://github.com/daleharvey/dh_date +pkg_dh_date_commit = master + +PACKAGES += dirbusterl +pkg_dirbusterl_name = dirbusterl +pkg_dirbusterl_description = DirBuster successor in Erlang +pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl +pkg_dirbusterl_fetch = git +pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl +pkg_dirbusterl_commit = master + +PACKAGES += dispcount +pkg_dispcount_name = dispcount +pkg_dispcount_description = Erlang task dispatcher based on ETS counters. +pkg_dispcount_homepage = https://github.com/ferd/dispcount +pkg_dispcount_fetch = git +pkg_dispcount_repo = https://github.com/ferd/dispcount +pkg_dispcount_commit = master + +PACKAGES += dlhttpc +pkg_dlhttpc_name = dlhttpc +pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints +pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc +pkg_dlhttpc_fetch = git +pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc +pkg_dlhttpc_commit = master + +PACKAGES += dns +pkg_dns_name = dns +pkg_dns_description = Erlang DNS library +pkg_dns_homepage = https://github.com/aetrion/dns_erlang +pkg_dns_fetch = git +pkg_dns_repo = https://github.com/aetrion/dns_erlang +pkg_dns_commit = master + +PACKAGES += dnssd +pkg_dnssd_name = dnssd +pkg_dnssd_description = Erlang interface to Apple's Bonjour D NS Service Discovery implementation +pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang +pkg_dnssd_fetch = git +pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang +pkg_dnssd_commit = master + +PACKAGES += dtl +pkg_dtl_name = dtl +pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang. +pkg_dtl_homepage = https://github.com/oinksoft/dtl +pkg_dtl_fetch = git +pkg_dtl_repo = https://github.com/oinksoft/dtl +pkg_dtl_commit = master + +PACKAGES += dynamic_compile +pkg_dynamic_compile_name = dynamic_compile +pkg_dynamic_compile_description = compile and load erlang modules from string input +pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile +pkg_dynamic_compile_fetch = git +pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile +pkg_dynamic_compile_commit = master + +PACKAGES += e2 +pkg_e2_name = e2 +pkg_e2_description = Library to simply writing correct OTP applications. +pkg_e2_homepage = http://e2project.org +pkg_e2_fetch = git +pkg_e2_repo = https://github.com/gar1t/e2 +pkg_e2_commit = master + +PACKAGES += eamf +pkg_eamf_name = eamf +pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang +pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf +pkg_eamf_fetch = git +pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf +pkg_eamf_commit = master + +PACKAGES += eavro +pkg_eavro_name = eavro +pkg_eavro_description = Apache Avro encoder/decoder +pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro +pkg_eavro_fetch = git +pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro +pkg_eavro_commit = master + +PACKAGES += ecapnp +pkg_ecapnp_name = ecapnp +pkg_ecapnp_description = Cap'n Proto library for Erlang +pkg_ecapnp_homepage = https://github.com/kaos/ecapnp +pkg_ecapnp_fetch = git +pkg_ecapnp_repo = https://github.com/kaos/ecapnp +pkg_ecapnp_commit = master + +PACKAGES += econfig +pkg_econfig_name = econfig +pkg_econfig_description = simple Erlang config handler using INI files +pkg_econfig_homepage = https://github.com/benoitc/econfig +pkg_econfig_fetch = git +pkg_econfig_repo = https://github.com/benoitc/econfig +pkg_econfig_commit = master + +PACKAGES += edate +pkg_edate_name = edate +pkg_edate_description = date manipulation library for erlang +pkg_edate_homepage = https://github.com/dweldon/edate +pkg_edate_fetch = git +pkg_edate_repo = https://github.com/dweldon/edate +pkg_edate_commit = master + +PACKAGES += edgar +pkg_edgar_name = edgar +pkg_edgar_description = Erlang Does GNU AR +pkg_edgar_homepage = https://github.com/crownedgrouse/edgar +pkg_edgar_fetch = git +pkg_edgar_repo = https://github.com/crownedgrouse/edgar +pkg_edgar_commit = master + +PACKAGES += edis +pkg_edis_name = edis +pkg_edis_description = An Erlang implementation of Redis KV Store +pkg_edis_homepage = http://inaka.github.com/edis/ +pkg_edis_fetch = git +pkg_edis_repo = https://github.com/inaka/edis +pkg_edis_commit = master + +PACKAGES += edns +pkg_edns_name = edns +pkg_edns_description = Erlang/OTP DNS server +pkg_edns_homepage = https://github.com/hcvst/erlang-dns +pkg_edns_fetch = git +pkg_edns_repo = https://github.com/hcvst/erlang-dns +pkg_edns_commit = master + +PACKAGES += edown +pkg_edown_name = edown +pkg_edown_description = EDoc extension for generating Github-flavored Markdown +pkg_edown_homepage = https://github.com/uwiger/edown +pkg_edown_fetch = git +pkg_edown_repo = https://github.com/uwiger/edown +pkg_edown_commit = master + +PACKAGES += eep_app +pkg_eep_app_name = eep_app +pkg_eep_app_description = Embedded Event Processing +pkg_eep_app_homepage = https://github.com/darach/eep-erl +pkg_eep_app_fetch = git +pkg_eep_app_repo = https://github.com/darach/eep-erl +pkg_eep_app_commit = master + +PACKAGES += eep +pkg_eep_name = eep +pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy +pkg_eep_homepage = https://github.com/virtan/eep +pkg_eep_fetch = git +pkg_eep_repo = https://github.com/virtan/eep +pkg_eep_commit = master + +PACKAGES += efene +pkg_efene_name = efene +pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX +pkg_efene_homepage = https://github.com/efene/efene +pkg_efene_fetch = git +pkg_efene_repo = https://github.com/efene/efene +pkg_efene_commit = master + +PACKAGES += eganglia +pkg_eganglia_name = eganglia +pkg_eganglia_description = Erlang library to interact with Ganglia +pkg_eganglia_homepage = https://github.com/inaka/eganglia +pkg_eganglia_fetch = git +pkg_eganglia_repo = https://github.com/inaka/eganglia +pkg_eganglia_commit = v0.9.1 + +PACKAGES += egeoip +pkg_egeoip_name = egeoip +pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database. +pkg_egeoip_homepage = https://github.com/mochi/egeoip +pkg_egeoip_fetch = git +pkg_egeoip_repo = https://github.com/mochi/egeoip +pkg_egeoip_commit = master + +PACKAGES += ehsa +pkg_ehsa_name = ehsa +pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules +pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa +pkg_ehsa_fetch = hg +pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa +pkg_ehsa_commit = 2.0.4 + +PACKAGES += ejabberd +pkg_ejabberd_name = ejabberd +pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform +pkg_ejabberd_homepage = https://github.com/processone/ejabberd +pkg_ejabberd_fetch = git +pkg_ejabberd_repo = https://github.com/processone/ejabberd +pkg_ejabberd_commit = master + +PACKAGES += ej +pkg_ej_name = ej +pkg_ej_description = Helper module for working with Erlang terms representing JSON +pkg_ej_homepage = https://github.com/seth/ej +pkg_ej_fetch = git +pkg_ej_repo = https://github.com/seth/ej +pkg_ej_commit = master + +PACKAGES += ejwt +pkg_ejwt_name = ejwt +pkg_ejwt_description = erlang library for JSON Web Token +pkg_ejwt_homepage = https://github.com/artefactop/ejwt +pkg_ejwt_fetch = git +pkg_ejwt_repo = https://github.com/artefactop/ejwt +pkg_ejwt_commit = master + +PACKAGES += ekaf +pkg_ekaf_name = ekaf +pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang. +pkg_ekaf_homepage = https://github.com/helpshift/ekaf +pkg_ekaf_fetch = git +pkg_ekaf_repo = https://github.com/helpshift/ekaf +pkg_ekaf_commit = master + +PACKAGES += elarm +pkg_elarm_name = elarm +pkg_elarm_description = Alarm Manager for Erlang. +pkg_elarm_homepage = https://github.com/esl/elarm +pkg_elarm_fetch = git +pkg_elarm_repo = https://github.com/esl/elarm +pkg_elarm_commit = master + +PACKAGES += eleveldb +pkg_eleveldb_name = eleveldb +pkg_eleveldb_description = Erlang LevelDB API +pkg_eleveldb_homepage = https://github.com/basho/eleveldb +pkg_eleveldb_fetch = git +pkg_eleveldb_repo = https://github.com/basho/eleveldb +pkg_eleveldb_commit = master + +PACKAGES += elli +pkg_elli_name = elli +pkg_elli_description = Simple, robust and performant Erlang web server +pkg_elli_homepage = https://github.com/knutin/elli +pkg_elli_fetch = git +pkg_elli_repo = https://github.com/knutin/elli +pkg_elli_commit = master + +PACKAGES += elvis +pkg_elvis_name = elvis +pkg_elvis_description = Erlang Style Reviewer +pkg_elvis_homepage = https://github.com/inaka/elvis +pkg_elvis_fetch = git +pkg_elvis_repo = https://github.com/inaka/elvis +pkg_elvis_commit = master + +PACKAGES += emagick +pkg_emagick_name = emagick +pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool. +pkg_emagick_homepage = https://github.com/kivra/emagick +pkg_emagick_fetch = git +pkg_emagick_repo = https://github.com/kivra/emagick +pkg_emagick_commit = master + +PACKAGES += emysql +pkg_emysql_name = emysql +pkg_emysql_description = Stable, pure Erlang MySQL driver. +pkg_emysql_homepage = https://github.com/Eonblast/Emysql +pkg_emysql_fetch = git +pkg_emysql_repo = https://github.com/Eonblast/Emysql +pkg_emysql_commit = master + +PACKAGES += enm +pkg_enm_name = enm +pkg_enm_description = Erlang driver for nanomsg +pkg_enm_homepage = https://github.com/basho/enm +pkg_enm_fetch = git +pkg_enm_repo = https://github.com/basho/enm +pkg_enm_commit = master + +PACKAGES += entop +pkg_entop_name = entop +pkg_entop_description = A top-like tool for monitoring an Erlang node +pkg_entop_homepage = https://github.com/mazenharake/entop +pkg_entop_fetch = git +pkg_entop_repo = https://github.com/mazenharake/entop +pkg_entop_commit = master + +PACKAGES += epcap +pkg_epcap_name = epcap +pkg_epcap_description = Erlang packet capture interface using pcap +pkg_epcap_homepage = https://github.com/msantos/epcap +pkg_epcap_fetch = git +pkg_epcap_repo = https://github.com/msantos/epcap +pkg_epcap_commit = master + +PACKAGES += eper +pkg_eper_name = eper +pkg_eper_description = Erlang performance and debugging tools. +pkg_eper_homepage = https://github.com/massemanet/eper +pkg_eper_fetch = git +pkg_eper_repo = https://github.com/massemanet/eper +pkg_eper_commit = master + +PACKAGES += epgsql +pkg_epgsql_name = epgsql +pkg_epgsql_description = Erlang PostgreSQL client library. +pkg_epgsql_homepage = https://github.com/epgsql/epgsql +pkg_epgsql_fetch = git +pkg_epgsql_repo = https://github.com/epgsql/epgsql +pkg_epgsql_commit = master + +PACKAGES += episcina +pkg_episcina_name = episcina +pkg_episcina_description = A simple non intrusive resource pool for connections +pkg_episcina_homepage = https://github.com/erlware/episcina +pkg_episcina_fetch = git +pkg_episcina_repo = https://github.com/erlware/episcina +pkg_episcina_commit = master + +PACKAGES += eplot +pkg_eplot_name = eplot +pkg_eplot_description = A plot engine written in erlang. +pkg_eplot_homepage = https://github.com/psyeugenic/eplot +pkg_eplot_fetch = git +pkg_eplot_repo = https://github.com/psyeugenic/eplot +pkg_eplot_commit = master + +PACKAGES += epocxy +pkg_epocxy_name = epocxy +pkg_epocxy_description = Erlang Patterns of Concurrency +pkg_epocxy_homepage = https://github.com/duomark/epocxy +pkg_epocxy_fetch = git +pkg_epocxy_repo = https://github.com/duomark/epocxy +pkg_epocxy_commit = master + +PACKAGES += epubnub +pkg_epubnub_name = epubnub +pkg_epubnub_description = Erlang PubNub API +pkg_epubnub_homepage = https://github.com/tsloughter/epubnub +pkg_epubnub_fetch = git +pkg_epubnub_repo = https://github.com/tsloughter/epubnub +pkg_epubnub_commit = master + +PACKAGES += eqm +pkg_eqm_name = eqm +pkg_eqm_description = Erlang pub sub with supply-demand channels +pkg_eqm_homepage = https://github.com/loucash/eqm +pkg_eqm_fetch = git +pkg_eqm_repo = https://github.com/loucash/eqm +pkg_eqm_commit = master + +PACKAGES += eredis +pkg_eredis_name = eredis +pkg_eredis_description = Erlang Redis client +pkg_eredis_homepage = https://github.com/wooga/eredis +pkg_eredis_fetch = git +pkg_eredis_repo = https://github.com/wooga/eredis +pkg_eredis_commit = master + +PACKAGES += eredis_pool +pkg_eredis_pool_name = eredis_pool +pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy. +pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool +pkg_eredis_pool_fetch = git +pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool +pkg_eredis_pool_commit = master + +PACKAGES += erlang_cep +pkg_erlang_cep_name = erlang_cep +pkg_erlang_cep_description = A basic CEP package written in erlang +pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep +pkg_erlang_cep_fetch = git +pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep +pkg_erlang_cep_commit = master + +PACKAGES += erlang_js +pkg_erlang_js_name = erlang_js +pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime. +pkg_erlang_js_homepage = https://github.com/basho/erlang_js +pkg_erlang_js_fetch = git +pkg_erlang_js_repo = https://github.com/basho/erlang_js +pkg_erlang_js_commit = master + +PACKAGES += erlang_localtime +pkg_erlang_localtime_name = erlang_localtime +pkg_erlang_localtime_description = Erlang library for conversion from one local time to another +pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime +pkg_erlang_localtime_fetch = git +pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime +pkg_erlang_localtime_commit = master + +PACKAGES += erlang_smtp +pkg_erlang_smtp_name = erlang_smtp +pkg_erlang_smtp_description = Erlang SMTP and POP3 server code. +pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp +pkg_erlang_smtp_fetch = git +pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp +pkg_erlang_smtp_commit = master + +PACKAGES += erlang_term +pkg_erlang_term_name = erlang_term +pkg_erlang_term_description = Erlang Term Info +pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term +pkg_erlang_term_fetch = git +pkg_erlang_term_repo = https://github.com/okeuday/erlang_term +pkg_erlang_term_commit = master + +PACKAGES += erlastic_search +pkg_erlastic_search_name = erlastic_search +pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface. +pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search +pkg_erlastic_search_fetch = git +pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search +pkg_erlastic_search_commit = master + +PACKAGES += erlasticsearch +pkg_erlasticsearch_name = erlasticsearch +pkg_erlasticsearch_description = Erlang thrift interface to elastic_search +pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch +pkg_erlasticsearch_fetch = git +pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch +pkg_erlasticsearch_commit = master + +PACKAGES += erlbrake +pkg_erlbrake_name = erlbrake +pkg_erlbrake_description = Erlang Airbrake notification client +pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake +pkg_erlbrake_fetch = git +pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake +pkg_erlbrake_commit = master + +PACKAGES += erlcloud +pkg_erlcloud_name = erlcloud +pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB) +pkg_erlcloud_homepage = https://github.com/gleber/erlcloud +pkg_erlcloud_fetch = git +pkg_erlcloud_repo = https://github.com/gleber/erlcloud +pkg_erlcloud_commit = master + +PACKAGES += erlcron +pkg_erlcron_name = erlcron +pkg_erlcron_description = Erlang cronish system +pkg_erlcron_homepage = https://github.com/erlware/erlcron +pkg_erlcron_fetch = git +pkg_erlcron_repo = https://github.com/erlware/erlcron +pkg_erlcron_commit = master + +PACKAGES += erldb +pkg_erldb_name = erldb +pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang +pkg_erldb_homepage = http://erldb.org +pkg_erldb_fetch = git +pkg_erldb_repo = https://github.com/erldb/erldb +pkg_erldb_commit = master + +PACKAGES += erldis +pkg_erldis_name = erldis +pkg_erldis_description = redis erlang client library +pkg_erldis_homepage = https://github.com/cstar/erldis +pkg_erldis_fetch = git +pkg_erldis_repo = https://github.com/cstar/erldis +pkg_erldis_commit = master + +PACKAGES += erldns +pkg_erldns_name = erldns +pkg_erldns_description = DNS server, in erlang. +pkg_erldns_homepage = https://github.com/aetrion/erl-dns +pkg_erldns_fetch = git +pkg_erldns_repo = https://github.com/aetrion/erl-dns +pkg_erldns_commit = master + +PACKAGES += erldocker +pkg_erldocker_name = erldocker +pkg_erldocker_description = Docker Remote API client for Erlang +pkg_erldocker_homepage = https://github.com/proger/erldocker +pkg_erldocker_fetch = git +pkg_erldocker_repo = https://github.com/proger/erldocker +pkg_erldocker_commit = master + +PACKAGES += erlfsmon +pkg_erlfsmon_name = erlfsmon +pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX +pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon +pkg_erlfsmon_fetch = git +pkg_erlfsmon_repo = https://github.com/proger/erlfsmon +pkg_erlfsmon_commit = master + +PACKAGES += erlgit +pkg_erlgit_name = erlgit +pkg_erlgit_description = Erlang convenience wrapper around git executable +pkg_erlgit_homepage = https://github.com/gleber/erlgit +pkg_erlgit_fetch = git +pkg_erlgit_repo = https://github.com/gleber/erlgit +pkg_erlgit_commit = master + +PACKAGES += erlguten +pkg_erlguten_name = erlguten +pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang. +pkg_erlguten_homepage = https://github.com/richcarl/erlguten +pkg_erlguten_fetch = git +pkg_erlguten_repo = https://github.com/richcarl/erlguten +pkg_erlguten_commit = master + +PACKAGES += erlmc +pkg_erlmc_name = erlmc +pkg_erlmc_description = Erlang memcached binary protocol client +pkg_erlmc_homepage = https://github.com/jkvor/erlmc +pkg_erlmc_fetch = git +pkg_erlmc_repo = https://github.com/jkvor/erlmc +pkg_erlmc_commit = master + +PACKAGES += erlmongo +pkg_erlmongo_name = erlmongo +pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support +pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo +pkg_erlmongo_fetch = git +pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo +pkg_erlmongo_commit = master + +PACKAGES += erlog +pkg_erlog_name = erlog +pkg_erlog_description = Prolog interpreter in and for Erlang +pkg_erlog_homepage = https://github.com/rvirding/erlog +pkg_erlog_fetch = git +pkg_erlog_repo = https://github.com/rvirding/erlog +pkg_erlog_commit = master + +PACKAGES += erlpass +pkg_erlpass_name = erlpass +pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever. +pkg_erlpass_homepage = https://github.com/ferd/erlpass +pkg_erlpass_fetch = git +pkg_erlpass_repo = https://github.com/ferd/erlpass +pkg_erlpass_commit = master + +PACKAGES += erlport +pkg_erlport_name = erlport +pkg_erlport_description = ErlPort - connect Erlang to other languages +pkg_erlport_homepage = https://github.com/hdima/erlport +pkg_erlport_fetch = git +pkg_erlport_repo = https://github.com/hdima/erlport +pkg_erlport_commit = master + +PACKAGES += erlsha2 +pkg_erlsha2_name = erlsha2 +pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs. +pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2 +pkg_erlsha2_fetch = git +pkg_erlsha2_repo = https://github.com/vinoski/erlsha2 +pkg_erlsha2_commit = master + +PACKAGES += erlsh +pkg_erlsh_name = erlsh +pkg_erlsh_description = Erlang shell tools +pkg_erlsh_homepage = https://github.com/proger/erlsh +pkg_erlsh_fetch = git +pkg_erlsh_repo = https://github.com/proger/erlsh +pkg_erlsh_commit = master + +PACKAGES += erlsom +pkg_erlsom_name = erlsom +pkg_erlsom_description = XML parser for Erlang +pkg_erlsom_homepage = https://github.com/willemdj/erlsom +pkg_erlsom_fetch = git +pkg_erlsom_repo = https://github.com/willemdj/erlsom +pkg_erlsom_commit = master + +PACKAGES += erl_streams +pkg_erl_streams_name = erl_streams +pkg_erl_streams_description = Streams in Erlang +pkg_erl_streams_homepage = https://github.com/epappas/erl_streams +pkg_erl_streams_fetch = git +pkg_erl_streams_repo = https://github.com/epappas/erl_streams +pkg_erl_streams_commit = master + +PACKAGES += erlubi +pkg_erlubi_name = erlubi +pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer) +pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi +pkg_erlubi_fetch = git +pkg_erlubi_repo = https://github.com/krestenkrab/erlubi +pkg_erlubi_commit = master + +PACKAGES += erlvolt +pkg_erlvolt_name = erlvolt +pkg_erlvolt_description = VoltDB Erlang Client Driver +pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang +pkg_erlvolt_fetch = git +pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang +pkg_erlvolt_commit = master + +PACKAGES += erlware_commons +pkg_erlware_commons_name = erlware_commons +pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components. +pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons +pkg_erlware_commons_fetch = git +pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons +pkg_erlware_commons_commit = master + +PACKAGES += erlydtl +pkg_erlydtl_name = erlydtl +pkg_erlydtl_description = Django Template Language for Erlang. +pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl +pkg_erlydtl_fetch = git +pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl +pkg_erlydtl_commit = master + +PACKAGES += errd +pkg_errd_name = errd +pkg_errd_description = Erlang RRDTool library +pkg_errd_homepage = https://github.com/archaelus/errd +pkg_errd_fetch = git +pkg_errd_repo = https://github.com/archaelus/errd +pkg_errd_commit = master + +PACKAGES += erserve +pkg_erserve_name = erserve +pkg_erserve_description = Erlang/Rserve communication interface +pkg_erserve_homepage = https://github.com/del/erserve +pkg_erserve_fetch = git +pkg_erserve_repo = https://github.com/del/erserve +pkg_erserve_commit = master + +PACKAGES += erwa +pkg_erwa_name = erwa +pkg_erwa_description = A WAMP router and client written in Erlang. +pkg_erwa_homepage = https://github.com/bwegh/erwa +pkg_erwa_fetch = git +pkg_erwa_repo = https://github.com/bwegh/erwa +pkg_erwa_commit = 0.1.1 + +PACKAGES += espec +pkg_espec_name = espec +pkg_espec_description = ESpec: Behaviour driven development framework for Erlang +pkg_espec_homepage = https://github.com/lucaspiller/espec +pkg_espec_fetch = git +pkg_espec_repo = https://github.com/lucaspiller/espec +pkg_espec_commit = master + +PACKAGES += estatsd +pkg_estatsd_name = estatsd +pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite +pkg_estatsd_homepage = https://github.com/RJ/estatsd +pkg_estatsd_fetch = git +pkg_estatsd_repo = https://github.com/RJ/estatsd +pkg_estatsd_commit = master + +PACKAGES += etap +pkg_etap_name = etap +pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output. +pkg_etap_homepage = https://github.com/ngerakines/etap +pkg_etap_fetch = git +pkg_etap_repo = https://github.com/ngerakines/etap +pkg_etap_commit = master + +PACKAGES += etest_http +pkg_etest_http_name = etest_http +pkg_etest_http_description = etest Assertions around HTTP (client-side) +pkg_etest_http_homepage = https://github.com/wooga/etest_http +pkg_etest_http_fetch = git +pkg_etest_http_repo = https://github.com/wooga/etest_http +pkg_etest_http_commit = master + +PACKAGES += etest +pkg_etest_name = etest +pkg_etest_description = A lightweight, convention over configuration test framework for Erlang +pkg_etest_homepage = https://github.com/wooga/etest +pkg_etest_fetch = git +pkg_etest_repo = https://github.com/wooga/etest +pkg_etest_commit = master + +PACKAGES += etoml +pkg_etoml_name = etoml +pkg_etoml_description = TOML language erlang parser +pkg_etoml_homepage = https://github.com/kalta/etoml +pkg_etoml_fetch = git +pkg_etoml_repo = https://github.com/kalta/etoml +pkg_etoml_commit = master + +PACKAGES += eunit_formatters +pkg_eunit_formatters_name = eunit_formatters +pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better. +pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters +pkg_eunit_formatters_fetch = git +pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters +pkg_eunit_formatters_commit = master + +PACKAGES += eunit +pkg_eunit_name = eunit +pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository. +pkg_eunit_homepage = https://github.com/richcarl/eunit +pkg_eunit_fetch = git +pkg_eunit_repo = https://github.com/richcarl/eunit +pkg_eunit_commit = master + +PACKAGES += euthanasia +pkg_euthanasia_name = euthanasia +pkg_euthanasia_description = Merciful killer for your Erlang processes +pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia +pkg_euthanasia_fetch = git +pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia +pkg_euthanasia_commit = master + +PACKAGES += evum +pkg_evum_name = evum +pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM +pkg_evum_homepage = https://github.com/msantos/evum +pkg_evum_fetch = git +pkg_evum_repo = https://github.com/msantos/evum +pkg_evum_commit = master + +PACKAGES += exec +pkg_exec_name = exec +pkg_exec_description = Execute and control OS processes from Erlang/OTP. +pkg_exec_homepage = http://saleyn.github.com/erlexec +pkg_exec_fetch = git +pkg_exec_repo = https://github.com/saleyn/erlexec +pkg_exec_commit = master + +PACKAGES += exml +pkg_exml_name = exml +pkg_exml_description = XML parsing library in Erlang +pkg_exml_homepage = https://github.com/paulgray/exml +pkg_exml_fetch = git +pkg_exml_repo = https://github.com/paulgray/exml +pkg_exml_commit = master + +PACKAGES += exometer +pkg_exometer_name = exometer +pkg_exometer_description = Basic measurement objects and probe behavior +pkg_exometer_homepage = https://github.com/Feuerlabs/exometer +pkg_exometer_fetch = git +pkg_exometer_repo = https://github.com/Feuerlabs/exometer +pkg_exometer_commit = 1.2 + +PACKAGES += exs1024 +pkg_exs1024_name = exs1024 +pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang. +pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024 +pkg_exs1024_fetch = git +pkg_exs1024_repo = https://github.com/jj1bdx/exs1024 +pkg_exs1024_commit = master + +PACKAGES += exs64 +pkg_exs64_name = exs64 +pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang. +pkg_exs64_homepage = https://github.com/jj1bdx/exs64 +pkg_exs64_fetch = git +pkg_exs64_repo = https://github.com/jj1bdx/exs64 +pkg_exs64_commit = master + +PACKAGES += exsplus116 +pkg_exsplus116_name = exsplus116 +pkg_exsplus116_description = Xorshift116plus for Erlang +pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116 +pkg_exsplus116_fetch = git +pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116 +pkg_exsplus116_commit = master + +PACKAGES += exsplus128 +pkg_exsplus128_name = exsplus128 +pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang. +pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128 +pkg_exsplus128_fetch = git +pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128 +pkg_exsplus128_commit = master + +PACKAGES += ezmq +pkg_ezmq_name = ezmq +pkg_ezmq_description = zMQ implemented in Erlang +pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq +pkg_ezmq_fetch = git +pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq +pkg_ezmq_commit = master + +PACKAGES += ezmtp +pkg_ezmtp_name = ezmtp +pkg_ezmtp_description = ZMTP protocol in pure Erlang. +pkg_ezmtp_homepage = https://github.com/a13x/ezmtp +pkg_ezmtp_fetch = git +pkg_ezmtp_repo = https://github.com/a13x/ezmtp +pkg_ezmtp_commit = master + +PACKAGES += fast_disk_log +pkg_fast_disk_log_name = fast_disk_log +pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger +pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log +pkg_fast_disk_log_fetch = git +pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log +pkg_fast_disk_log_commit = master + +PACKAGES += feeder +pkg_feeder_name = feeder +pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds. +pkg_feeder_homepage = https://github.com/michaelnisi/feeder +pkg_feeder_fetch = git +pkg_feeder_repo = https://github.com/michaelnisi/feeder +pkg_feeder_commit = v1.4.6 + +PACKAGES += fix +pkg_fix_name = fix +pkg_fix_description = http://fixprotocol.org/ implementation. +pkg_fix_homepage = https://github.com/maxlapshin/fix +pkg_fix_fetch = git +pkg_fix_repo = https://github.com/maxlapshin/fix +pkg_fix_commit = master + +PACKAGES += flower +pkg_flower_name = flower +pkg_flower_description = FlowER - a Erlang OpenFlow development platform +pkg_flower_homepage = https://github.com/travelping/flower +pkg_flower_fetch = git +pkg_flower_repo = https://github.com/travelping/flower +pkg_flower_commit = master + +PACKAGES += fn +pkg_fn_name = fn +pkg_fn_description = Function utilities for Erlang +pkg_fn_homepage = https://github.com/reiddraper/fn +pkg_fn_fetch = git +pkg_fn_repo = https://github.com/reiddraper/fn +pkg_fn_commit = master + +PACKAGES += folsom_cowboy +pkg_folsom_cowboy_name = folsom_cowboy +pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper. +pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy +pkg_folsom_cowboy_fetch = git +pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy +pkg_folsom_cowboy_commit = master + +PACKAGES += folsomite +pkg_folsomite_name = folsomite +pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics +pkg_folsomite_homepage = https://github.com/campanja/folsomite +pkg_folsomite_fetch = git +pkg_folsomite_repo = https://github.com/campanja/folsomite +pkg_folsomite_commit = master + +PACKAGES += folsom +pkg_folsom_name = folsom +pkg_folsom_description = Expose Erlang Events and Metrics +pkg_folsom_homepage = https://github.com/boundary/folsom +pkg_folsom_fetch = git +pkg_folsom_repo = https://github.com/boundary/folsom +pkg_folsom_commit = master + +PACKAGES += fs +pkg_fs_name = fs +pkg_fs_description = Erlang FileSystem Listener +pkg_fs_homepage = https://github.com/synrc/fs +pkg_fs_fetch = git +pkg_fs_repo = https://github.com/synrc/fs +pkg_fs_commit = master + +PACKAGES += fuse +pkg_fuse_name = fuse +pkg_fuse_description = A Circuit Breaker for Erlang +pkg_fuse_homepage = https://github.com/jlouis/fuse +pkg_fuse_fetch = git +pkg_fuse_repo = https://github.com/jlouis/fuse +pkg_fuse_commit = master + +PACKAGES += gcm +pkg_gcm_name = gcm +pkg_gcm_description = An Erlang application for Google Cloud Messaging +pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang +pkg_gcm_fetch = git +pkg_gcm_repo = https://github.com/pdincau/gcm-erlang +pkg_gcm_commit = master + +PACKAGES += gcprof +pkg_gcprof_name = gcprof +pkg_gcprof_description = Garbage Collection profiler for Erlang +pkg_gcprof_homepage = https://github.com/knutin/gcprof +pkg_gcprof_fetch = git +pkg_gcprof_repo = https://github.com/knutin/gcprof +pkg_gcprof_commit = master + +PACKAGES += geas +pkg_geas_name = geas +pkg_geas_description = Guess Erlang Application Scattering +pkg_geas_homepage = https://github.com/crownedgrouse/geas +pkg_geas_fetch = git +pkg_geas_repo = https://github.com/crownedgrouse/geas +pkg_geas_commit = master + +PACKAGES += geef +pkg_geef_name = geef +pkg_geef_description = Git NEEEEF (Erlang NIF) +pkg_geef_homepage = https://github.com/carlosmn/geef +pkg_geef_fetch = git +pkg_geef_repo = https://github.com/carlosmn/geef +pkg_geef_commit = master + +PACKAGES += gen_coap +pkg_gen_coap_name = gen_coap +pkg_gen_coap_description = Generic Erlang CoAP Client/Server +pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap +pkg_gen_coap_fetch = git +pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap +pkg_gen_coap_commit = master + +PACKAGES += gen_cycle +pkg_gen_cycle_name = gen_cycle +pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks +pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle +pkg_gen_cycle_fetch = git +pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle +pkg_gen_cycle_commit = develop + +PACKAGES += gen_icmp +pkg_gen_icmp_name = gen_icmp +pkg_gen_icmp_description = Erlang interface to ICMP sockets +pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp +pkg_gen_icmp_fetch = git +pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp +pkg_gen_icmp_commit = master + +PACKAGES += gen_nb_server +pkg_gen_nb_server_name = gen_nb_server +pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers +pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server +pkg_gen_nb_server_fetch = git +pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server +pkg_gen_nb_server_commit = master + +PACKAGES += gen_paxos +pkg_gen_paxos_name = gen_paxos +pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol +pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos +pkg_gen_paxos_fetch = git +pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos +pkg_gen_paxos_commit = master + +PACKAGES += gen_smtp +pkg_gen_smtp_name = gen_smtp +pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules +pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp +pkg_gen_smtp_fetch = git +pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp +pkg_gen_smtp_commit = master + +PACKAGES += gen_tracker +pkg_gen_tracker_name = gen_tracker +pkg_gen_tracker_description = supervisor with ets handling of children and their metadata +pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker +pkg_gen_tracker_fetch = git +pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker +pkg_gen_tracker_commit = master + +PACKAGES += gen_unix +pkg_gen_unix_name = gen_unix +pkg_gen_unix_description = Erlang Unix socket interface +pkg_gen_unix_homepage = https://github.com/msantos/gen_unix +pkg_gen_unix_fetch = git +pkg_gen_unix_repo = https://github.com/msantos/gen_unix +pkg_gen_unix_commit = master + +PACKAGES += getopt +pkg_getopt_name = getopt +pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax +pkg_getopt_homepage = https://github.com/jcomellas/getopt +pkg_getopt_fetch = git +pkg_getopt_repo = https://github.com/jcomellas/getopt +pkg_getopt_commit = master + +PACKAGES += gettext +pkg_gettext_name = gettext +pkg_gettext_description = Erlang internationalization library. +pkg_gettext_homepage = https://github.com/etnt/gettext +pkg_gettext_fetch = git +pkg_gettext_repo = https://github.com/etnt/gettext +pkg_gettext_commit = master + +PACKAGES += giallo +pkg_giallo_name = giallo +pkg_giallo_description = Small and flexible web framework on top of Cowboy +pkg_giallo_homepage = https://github.com/kivra/giallo +pkg_giallo_fetch = git +pkg_giallo_repo = https://github.com/kivra/giallo +pkg_giallo_commit = master + +PACKAGES += gin +pkg_gin_name = gin +pkg_gin_description = The guards and for Erlang parse_transform +pkg_gin_homepage = https://github.com/mad-cocktail/gin +pkg_gin_fetch = git +pkg_gin_repo = https://github.com/mad-cocktail/gin +pkg_gin_commit = master + +PACKAGES += gitty +pkg_gitty_name = gitty +pkg_gitty_description = Git access in erlang +pkg_gitty_homepage = https://github.com/maxlapshin/gitty +pkg_gitty_fetch = git +pkg_gitty_repo = https://github.com/maxlapshin/gitty +pkg_gitty_commit = master + +PACKAGES += gold_fever +pkg_gold_fever_name = gold_fever +pkg_gold_fever_description = A Treasure Hunt for Erlangers +pkg_gold_fever_homepage = https://github.com/inaka/gold_fever +pkg_gold_fever_fetch = git +pkg_gold_fever_repo = https://github.com/inaka/gold_fever +pkg_gold_fever_commit = master + +PACKAGES += gossiperl +pkg_gossiperl_name = gossiperl +pkg_gossiperl_description = Gossip middleware in Erlang +pkg_gossiperl_homepage = http://gossiperl.com/ +pkg_gossiperl_fetch = git +pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl +pkg_gossiperl_commit = master + +PACKAGES += gpb +pkg_gpb_name = gpb +pkg_gpb_description = A Google Protobuf implementation for Erlang +pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb +pkg_gpb_fetch = git +pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb +pkg_gpb_commit = master + +PACKAGES += gproc +pkg_gproc_name = gproc +pkg_gproc_description = Extended process registry for Erlang +pkg_gproc_homepage = https://github.com/uwiger/gproc +pkg_gproc_fetch = git +pkg_gproc_repo = https://github.com/uwiger/gproc +pkg_gproc_commit = master + +PACKAGES += grapherl +pkg_grapherl_name = grapherl +pkg_grapherl_description = Create graphs of Erlang systems and programs +pkg_grapherl_homepage = https://github.com/eproxus/grapherl +pkg_grapherl_fetch = git +pkg_grapherl_repo = https://github.com/eproxus/grapherl +pkg_grapherl_commit = master + +PACKAGES += gun +pkg_gun_name = gun +pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang. +pkg_gun_homepage = http//ninenines.eu +pkg_gun_fetch = git +pkg_gun_repo = https://github.com/ninenines/gun +pkg_gun_commit = master + +PACKAGES += gut +pkg_gut_name = gut +pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman +pkg_gut_homepage = https://github.com/unbalancedparentheses/gut +pkg_gut_fetch = git +pkg_gut_repo = https://github.com/unbalancedparentheses/gut +pkg_gut_commit = master + +PACKAGES += hackney +pkg_hackney_name = hackney +pkg_hackney_description = simple HTTP client in Erlang +pkg_hackney_homepage = https://github.com/benoitc/hackney +pkg_hackney_fetch = git +pkg_hackney_repo = https://github.com/benoitc/hackney +pkg_hackney_commit = master + +PACKAGES += hamcrest +pkg_hamcrest_name = hamcrest +pkg_hamcrest_description = Erlang port of Hamcrest +pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang +pkg_hamcrest_fetch = git +pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang +pkg_hamcrest_commit = master + +PACKAGES += hanoidb +pkg_hanoidb_name = hanoidb +pkg_hanoidb_description = Erlang LSM BTree Storage +pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb +pkg_hanoidb_fetch = git +pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb +pkg_hanoidb_commit = master + +PACKAGES += hottub +pkg_hottub_name = hottub +pkg_hottub_description = Permanent Erlang Worker Pool +pkg_hottub_homepage = https://github.com/bfrog/hottub +pkg_hottub_fetch = git +pkg_hottub_repo = https://github.com/bfrog/hottub +pkg_hottub_commit = master + +PACKAGES += hpack +pkg_hpack_name = hpack +pkg_hpack_description = HPACK Implementation for Erlang +pkg_hpack_homepage = https://github.com/joedevivo/hpack +pkg_hpack_fetch = git +pkg_hpack_repo = https://github.com/joedevivo/hpack +pkg_hpack_commit = master + +PACKAGES += hyper +pkg_hyper_name = hyper +pkg_hyper_description = Erlang implementation of HyperLogLog +pkg_hyper_homepage = https://github.com/GameAnalytics/hyper +pkg_hyper_fetch = git +pkg_hyper_repo = https://github.com/GameAnalytics/hyper +pkg_hyper_commit = master + +PACKAGES += i18n +pkg_i18n_name = i18n +pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e) +pkg_i18n_homepage = https://github.com/erlang-unicode/i18n +pkg_i18n_fetch = git +pkg_i18n_repo = https://github.com/erlang-unicode/i18n +pkg_i18n_commit = master + +PACKAGES += ibrowse +pkg_ibrowse_name = ibrowse +pkg_ibrowse_description = Erlang HTTP client +pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse +pkg_ibrowse_fetch = git +pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse +pkg_ibrowse_commit = v4.1.1 + +PACKAGES += ierlang +pkg_ierlang_name = ierlang +pkg_ierlang_description = An Erlang language kernel for IPython. +pkg_ierlang_homepage = https://github.com/robbielynch/ierlang +pkg_ierlang_fetch = git +pkg_ierlang_repo = https://github.com/robbielynch/ierlang +pkg_ierlang_commit = master + +PACKAGES += iota +pkg_iota_name = iota +pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code +pkg_iota_homepage = https://github.com/jpgneves/iota +pkg_iota_fetch = git +pkg_iota_repo = https://github.com/jpgneves/iota +pkg_iota_commit = master + +PACKAGES += ircd +pkg_ircd_name = ircd +pkg_ircd_description = A pluggable IRC daemon application/library for Erlang. +pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd +pkg_ircd_fetch = git +pkg_ircd_repo = https://github.com/tonyg/erlang-ircd +pkg_ircd_commit = master + +PACKAGES += irc_lib +pkg_irc_lib_name = irc_lib +pkg_irc_lib_description = Erlang irc client library +pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib +pkg_irc_lib_fetch = git +pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib +pkg_irc_lib_commit = master + +PACKAGES += iris +pkg_iris_name = iris +pkg_iris_description = Iris Erlang binding +pkg_iris_homepage = https://github.com/project-iris/iris-erl +pkg_iris_fetch = git +pkg_iris_repo = https://github.com/project-iris/iris-erl +pkg_iris_commit = master + +PACKAGES += iso8601 +pkg_iso8601_name = iso8601 +pkg_iso8601_description = Erlang ISO 8601 date formatter/parser +pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601 +pkg_iso8601_fetch = git +pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601 +pkg_iso8601_commit = master + +PACKAGES += jamdb_sybase +pkg_jamdb_sybase_name = jamdb_sybase +pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE +pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase +pkg_jamdb_sybase_fetch = git +pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase +pkg_jamdb_sybase_commit = 0.6.0 + +PACKAGES += jerg +pkg_jerg_name = jerg +pkg_jerg_description = JSON Schema to Erlang Records Generator +pkg_jerg_homepage = https://github.com/ddossot/jerg +pkg_jerg_fetch = git +pkg_jerg_repo = https://github.com/ddossot/jerg +pkg_jerg_commit = master + +PACKAGES += jesse +pkg_jesse_name = jesse +pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang. +pkg_jesse_homepage = https://github.com/for-GET/jesse +pkg_jesse_fetch = git +pkg_jesse_repo = https://github.com/for-GET/jesse +pkg_jesse_commit = master + +PACKAGES += jiffy +pkg_jiffy_name = jiffy +pkg_jiffy_description = JSON NIFs for Erlang. +pkg_jiffy_homepage = https://github.com/davisp/jiffy +pkg_jiffy_fetch = git +pkg_jiffy_repo = https://github.com/davisp/jiffy +pkg_jiffy_commit = master + +PACKAGES += jiffy_v +pkg_jiffy_v_name = jiffy_v +pkg_jiffy_v_description = JSON validation utility +pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v +pkg_jiffy_v_fetch = git +pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v +pkg_jiffy_v_commit = 0.3.3 + +PACKAGES += jobs +pkg_jobs_name = jobs +pkg_jobs_description = a Job scheduler for load regulation +pkg_jobs_homepage = https://github.com/esl/jobs +pkg_jobs_fetch = git +pkg_jobs_repo = https://github.com/esl/jobs +pkg_jobs_commit = 0.3 + +PACKAGES += joxa +pkg_joxa_name = joxa +pkg_joxa_description = A Modern Lisp for the Erlang VM +pkg_joxa_homepage = https://github.com/joxa/joxa +pkg_joxa_fetch = git +pkg_joxa_repo = https://github.com/joxa/joxa +pkg_joxa_commit = master + +PACKAGES += jsone +pkg_jsone_name = jsone +pkg_jsone_description = An Erlang library for encoding, decoding JSON data. +pkg_jsone_homepage = https://github.com/sile/jsone.git +pkg_jsone_fetch = git +pkg_jsone_repo = https://github.com/sile/jsone.git +pkg_jsone_commit = master + +PACKAGES += jsonerl +pkg_jsonerl_name = jsonerl +pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder +pkg_jsonerl_homepage = https://github.com/lambder/jsonerl +pkg_jsonerl_fetch = git +pkg_jsonerl_repo = https://github.com/lambder/jsonerl +pkg_jsonerl_commit = master + +PACKAGES += json +pkg_json_name = json +pkg_json_description = a high level json library for erlang (17.0+) +pkg_json_homepage = https://github.com/talentdeficit/json +pkg_json_fetch = git +pkg_json_repo = https://github.com/talentdeficit/json +pkg_json_commit = master + +PACKAGES += jsonpath +pkg_jsonpath_name = jsonpath +pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation +pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath +pkg_jsonpath_fetch = git +pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath +pkg_jsonpath_commit = master + +PACKAGES += json_rec +pkg_json_rec_name = json_rec +pkg_json_rec_description = JSON to erlang record +pkg_json_rec_homepage = https://github.com/justinkirby/json_rec +pkg_json_rec_fetch = git +pkg_json_rec_repo = https://github.com/justinkirby/json_rec +pkg_json_rec_commit = master + +PACKAGES += jsonx +pkg_jsonx_name = jsonx +pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C. +pkg_jsonx_homepage = https://github.com/iskra/jsonx +pkg_jsonx_fetch = git +pkg_jsonx_repo = https://github.com/iskra/jsonx +pkg_jsonx_commit = master + +PACKAGES += jsx +pkg_jsx_name = jsx +pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON. +pkg_jsx_homepage = https://github.com/talentdeficit/jsx +pkg_jsx_fetch = git +pkg_jsx_repo = https://github.com/talentdeficit/jsx +pkg_jsx_commit = master + +PACKAGES += kafka +pkg_kafka_name = kafka +pkg_kafka_description = Kafka consumer and producer in Erlang +pkg_kafka_homepage = https://github.com/wooga/kafka-erlang +pkg_kafka_fetch = git +pkg_kafka_repo = https://github.com/wooga/kafka-erlang +pkg_kafka_commit = master + +PACKAGES += kai +pkg_kai_name = kai +pkg_kai_description = DHT storage by Takeshi Inoue +pkg_kai_homepage = https://github.com/synrc/kai +pkg_kai_fetch = git +pkg_kai_repo = https://github.com/synrc/kai +pkg_kai_commit = master + +PACKAGES += katja +pkg_katja_name = katja +pkg_katja_description = A simple Riemann client written in Erlang. +pkg_katja_homepage = https://github.com/nifoc/katja +pkg_katja_fetch = git +pkg_katja_repo = https://github.com/nifoc/katja +pkg_katja_commit = master + +PACKAGES += kdht +pkg_kdht_name = kdht +pkg_kdht_description = kdht is an erlang DHT implementation +pkg_kdht_homepage = https://github.com/kevinlynx/kdht +pkg_kdht_fetch = git +pkg_kdht_repo = https://github.com/kevinlynx/kdht +pkg_kdht_commit = master + +PACKAGES += key2value +pkg_key2value_name = key2value +pkg_key2value_description = Erlang 2-way map +pkg_key2value_homepage = https://github.com/okeuday/key2value +pkg_key2value_fetch = git +pkg_key2value_repo = https://github.com/okeuday/key2value +pkg_key2value_commit = master + +PACKAGES += keys1value +pkg_keys1value_name = keys1value +pkg_keys1value_description = Erlang set associative map for key lists +pkg_keys1value_homepage = https://github.com/okeuday/keys1value +pkg_keys1value_fetch = git +pkg_keys1value_repo = https://github.com/okeuday/keys1value +pkg_keys1value_commit = master + +PACKAGES += kinetic +pkg_kinetic_name = kinetic +pkg_kinetic_description = Erlang Kinesis Client +pkg_kinetic_homepage = https://github.com/AdRoll/kinetic +pkg_kinetic_fetch = git +pkg_kinetic_repo = https://github.com/AdRoll/kinetic +pkg_kinetic_commit = master + +PACKAGES += kjell +pkg_kjell_name = kjell +pkg_kjell_description = Erlang Shell +pkg_kjell_homepage = https://github.com/karlll/kjell +pkg_kjell_fetch = git +pkg_kjell_repo = https://github.com/karlll/kjell +pkg_kjell_commit = master + +PACKAGES += kraken +pkg_kraken_name = kraken +pkg_kraken_description = Distributed Pubsub Server for Realtime Apps +pkg_kraken_homepage = https://github.com/Asana/kraken +pkg_kraken_fetch = git +pkg_kraken_repo = https://github.com/Asana/kraken +pkg_kraken_commit = master + +PACKAGES += kucumberl +pkg_kucumberl_name = kucumberl +pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber +pkg_kucumberl_homepage = https://github.com/openshine/kucumberl +pkg_kucumberl_fetch = git +pkg_kucumberl_repo = https://github.com/openshine/kucumberl +pkg_kucumberl_commit = master + +PACKAGES += kvc +pkg_kvc_name = kvc +pkg_kvc_description = KVC - Key Value Coding for Erlang data structures +pkg_kvc_homepage = https://github.com/etrepum/kvc +pkg_kvc_fetch = git +pkg_kvc_repo = https://github.com/etrepum/kvc +pkg_kvc_commit = master + +PACKAGES += kvlists +pkg_kvlists_name = kvlists +pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang +pkg_kvlists_homepage = https://github.com/jcomellas/kvlists +pkg_kvlists_fetch = git +pkg_kvlists_repo = https://github.com/jcomellas/kvlists +pkg_kvlists_commit = master + +PACKAGES += kvs +pkg_kvs_name = kvs +pkg_kvs_description = Container and Iterator +pkg_kvs_homepage = https://github.com/synrc/kvs +pkg_kvs_fetch = git +pkg_kvs_repo = https://github.com/synrc/kvs +pkg_kvs_commit = master + +PACKAGES += lager_amqp_backend +pkg_lager_amqp_backend_name = lager_amqp_backend +pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend +pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend +pkg_lager_amqp_backend_fetch = git +pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend +pkg_lager_amqp_backend_commit = master + +PACKAGES += lager +pkg_lager_name = lager +pkg_lager_description = A logging framework for Erlang/OTP. +pkg_lager_homepage = https://github.com/basho/lager +pkg_lager_fetch = git +pkg_lager_repo = https://github.com/basho/lager +pkg_lager_commit = master + +PACKAGES += lager_syslog +pkg_lager_syslog_name = lager_syslog +pkg_lager_syslog_description = Syslog backend for lager +pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog +pkg_lager_syslog_fetch = git +pkg_lager_syslog_repo = https://github.com/basho/lager_syslog +pkg_lager_syslog_commit = master + +PACKAGES += lambdapad +pkg_lambdapad_name = lambdapad +pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang. +pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad +pkg_lambdapad_fetch = git +pkg_lambdapad_repo = https://github.com/gar1t/lambdapad +pkg_lambdapad_commit = master + +PACKAGES += lasp +pkg_lasp_name = lasp +pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations +pkg_lasp_homepage = http://lasp-lang.org/ +pkg_lasp_fetch = git +pkg_lasp_repo = https://github.com/lasp-lang/lasp +pkg_lasp_commit = master + +PACKAGES += lasse +pkg_lasse_name = lasse +pkg_lasse_description = SSE handler for Cowboy +pkg_lasse_homepage = https://github.com/inaka/lasse +pkg_lasse_fetch = git +pkg_lasse_repo = https://github.com/inaka/lasse +pkg_lasse_commit = 0.1.0 + +PACKAGES += ldap +pkg_ldap_name = ldap +pkg_ldap_description = LDAP server written in Erlang +pkg_ldap_homepage = https://github.com/spawnproc/ldap +pkg_ldap_fetch = git +pkg_ldap_repo = https://github.com/spawnproc/ldap +pkg_ldap_commit = master + +PACKAGES += lethink +pkg_lethink_name = lethink +pkg_lethink_description = erlang driver for rethinkdb +pkg_lethink_homepage = https://github.com/taybin/lethink +pkg_lethink_fetch = git +pkg_lethink_repo = https://github.com/taybin/lethink +pkg_lethink_commit = master + +PACKAGES += lfe +pkg_lfe_name = lfe +pkg_lfe_description = Lisp Flavoured Erlang (LFE) +pkg_lfe_homepage = https://github.com/rvirding/lfe +pkg_lfe_fetch = git +pkg_lfe_repo = https://github.com/rvirding/lfe +pkg_lfe_commit = master + +PACKAGES += ling +pkg_ling_name = ling +pkg_ling_description = Erlang on Xen +pkg_ling_homepage = https://github.com/cloudozer/ling +pkg_ling_fetch = git +pkg_ling_repo = https://github.com/cloudozer/ling +pkg_ling_commit = master + +PACKAGES += live +pkg_live_name = live +pkg_live_description = Automated module and configuration reloader. +pkg_live_homepage = http://ninenines.eu +pkg_live_fetch = git +pkg_live_repo = https://github.com/ninenines/live +pkg_live_commit = master + +PACKAGES += lmq +pkg_lmq_name = lmq +pkg_lmq_description = Lightweight Message Queue +pkg_lmq_homepage = https://github.com/iij/lmq +pkg_lmq_fetch = git +pkg_lmq_repo = https://github.com/iij/lmq +pkg_lmq_commit = master + +PACKAGES += locker +pkg_locker_name = locker +pkg_locker_description = Atomic distributed 'check and set' for short-lived keys +pkg_locker_homepage = https://github.com/wooga/locker +pkg_locker_fetch = git +pkg_locker_repo = https://github.com/wooga/locker +pkg_locker_commit = master + +PACKAGES += locks +pkg_locks_name = locks +pkg_locks_description = A scalable, deadlock-resolving resource locker +pkg_locks_homepage = https://github.com/uwiger/locks +pkg_locks_fetch = git +pkg_locks_repo = https://github.com/uwiger/locks +pkg_locks_commit = master + +PACKAGES += log4erl +pkg_log4erl_name = log4erl +pkg_log4erl_description = A logger for erlang in the spirit of Log4J. +pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl +pkg_log4erl_fetch = git +pkg_log4erl_repo = https://github.com/ahmednawras/log4erl +pkg_log4erl_commit = master + +PACKAGES += lol +pkg_lol_name = lol +pkg_lol_description = Lisp on erLang, and programming is fun again +pkg_lol_homepage = https://github.com/b0oh/lol +pkg_lol_fetch = git +pkg_lol_repo = https://github.com/b0oh/lol +pkg_lol_commit = master + +PACKAGES += lucid +pkg_lucid_name = lucid +pkg_lucid_description = HTTP/2 server written in Erlang +pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid +pkg_lucid_fetch = git +pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid +pkg_lucid_commit = master + +PACKAGES += luerl +pkg_luerl_name = luerl +pkg_luerl_description = Lua in Erlang +pkg_luerl_homepage = https://github.com/rvirding/luerl +pkg_luerl_fetch = git +pkg_luerl_repo = https://github.com/rvirding/luerl +pkg_luerl_commit = develop + +PACKAGES += luwak +pkg_luwak_name = luwak +pkg_luwak_description = Large-object storage interface for Riak +pkg_luwak_homepage = https://github.com/basho/luwak +pkg_luwak_fetch = git +pkg_luwak_repo = https://github.com/basho/luwak +pkg_luwak_commit = master + +PACKAGES += lux +pkg_lux_name = lux +pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands +pkg_lux_homepage = https://github.com/hawk/lux +pkg_lux_fetch = git +pkg_lux_repo = https://github.com/hawk/lux +pkg_lux_commit = master + +PACKAGES += machi +pkg_machi_name = machi +pkg_machi_description = Machi file store +pkg_machi_homepage = https://github.com/basho/machi +pkg_machi_fetch = git +pkg_machi_repo = https://github.com/basho/machi +pkg_machi_commit = master + +PACKAGES += mad +pkg_mad_name = mad +pkg_mad_description = Small and Fast Rebar Replacement +pkg_mad_homepage = https://github.com/synrc/mad +pkg_mad_fetch = git +pkg_mad_repo = https://github.com/synrc/mad +pkg_mad_commit = master + +PACKAGES += marina +pkg_marina_name = marina +pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client +pkg_marina_homepage = https://github.com/lpgauth/marina +pkg_marina_fetch = git +pkg_marina_repo = https://github.com/lpgauth/marina +pkg_marina_commit = master + +PACKAGES += mavg +pkg_mavg_name = mavg +pkg_mavg_description = Erlang :: Exponential moving average library +pkg_mavg_homepage = https://github.com/EchoTeam/mavg +pkg_mavg_fetch = git +pkg_mavg_repo = https://github.com/EchoTeam/mavg +pkg_mavg_commit = master + +PACKAGES += mcd +pkg_mcd_name = mcd +pkg_mcd_description = Fast memcached protocol client in pure Erlang +pkg_mcd_homepage = https://github.com/EchoTeam/mcd +pkg_mcd_fetch = git +pkg_mcd_repo = https://github.com/EchoTeam/mcd +pkg_mcd_commit = master + +PACKAGES += mcerlang +pkg_mcerlang_name = mcerlang +pkg_mcerlang_description = The McErlang model checker for Erlang +pkg_mcerlang_homepage = https://github.com/fredlund/McErlang +pkg_mcerlang_fetch = git +pkg_mcerlang_repo = https://github.com/fredlund/McErlang +pkg_mcerlang_commit = master + +PACKAGES += mc_erl +pkg_mc_erl_name = mc_erl +pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang. +pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl +pkg_mc_erl_fetch = git +pkg_mc_erl_repo = https://github.com/clonejo/mc-erl +pkg_mc_erl_commit = master + +PACKAGES += meck +pkg_meck_name = meck +pkg_meck_description = A mocking library for Erlang +pkg_meck_homepage = https://github.com/eproxus/meck +pkg_meck_fetch = git +pkg_meck_repo = https://github.com/eproxus/meck +pkg_meck_commit = master + +PACKAGES += mekao +pkg_mekao_name = mekao +pkg_mekao_description = SQL constructor +pkg_mekao_homepage = https://github.com/ddosia/mekao +pkg_mekao_fetch = git +pkg_mekao_repo = https://github.com/ddosia/mekao +pkg_mekao_commit = master + +PACKAGES += memo +pkg_memo_name = memo +pkg_memo_description = Erlang memoization server +pkg_memo_homepage = https://github.com/tuncer/memo +pkg_memo_fetch = git +pkg_memo_repo = https://github.com/tuncer/memo +pkg_memo_commit = master + +PACKAGES += merge_index +pkg_merge_index_name = merge_index +pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop). +pkg_merge_index_homepage = https://github.com/basho/merge_index +pkg_merge_index_fetch = git +pkg_merge_index_repo = https://github.com/basho/merge_index +pkg_merge_index_commit = master + +PACKAGES += merl +pkg_merl_name = merl +pkg_merl_description = Metaprogramming in Erlang +pkg_merl_homepage = https://github.com/richcarl/merl +pkg_merl_fetch = git +pkg_merl_repo = https://github.com/richcarl/merl +pkg_merl_commit = master + +PACKAGES += mimerl +pkg_mimerl_name = mimerl +pkg_mimerl_description = library to handle mimetypes +pkg_mimerl_homepage = https://github.com/benoitc/mimerl +pkg_mimerl_fetch = git +pkg_mimerl_repo = https://github.com/benoitc/mimerl +pkg_mimerl_commit = master + +PACKAGES += mimetypes +pkg_mimetypes_name = mimetypes +pkg_mimetypes_description = Erlang MIME types library +pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes +pkg_mimetypes_fetch = git +pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes +pkg_mimetypes_commit = master + +PACKAGES += mixer +pkg_mixer_name = mixer +pkg_mixer_description = Mix in functions from other modules +pkg_mixer_homepage = https://github.com/chef/mixer +pkg_mixer_fetch = git +pkg_mixer_repo = https://github.com/chef/mixer +pkg_mixer_commit = master + +PACKAGES += mochiweb +pkg_mochiweb_name = mochiweb +pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers. +pkg_mochiweb_homepage = https://github.com/mochi/mochiweb +pkg_mochiweb_fetch = git +pkg_mochiweb_repo = https://github.com/mochi/mochiweb +pkg_mochiweb_commit = master + +PACKAGES += mochiweb_xpath +pkg_mochiweb_xpath_name = mochiweb_xpath +pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser +pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath +pkg_mochiweb_xpath_fetch = git +pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath +pkg_mochiweb_xpath_commit = master + +PACKAGES += mockgyver +pkg_mockgyver_name = mockgyver +pkg_mockgyver_description = A mocking library for Erlang +pkg_mockgyver_homepage = https://github.com/klajo/mockgyver +pkg_mockgyver_fetch = git +pkg_mockgyver_repo = https://github.com/klajo/mockgyver +pkg_mockgyver_commit = master + +PACKAGES += modlib +pkg_modlib_name = modlib +pkg_modlib_description = Web framework based on Erlang's inets httpd +pkg_modlib_homepage = https://github.com/gar1t/modlib +pkg_modlib_fetch = git +pkg_modlib_repo = https://github.com/gar1t/modlib +pkg_modlib_commit = master + +PACKAGES += mongodb +pkg_mongodb_name = mongodb +pkg_mongodb_description = MongoDB driver for Erlang +pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang +pkg_mongodb_fetch = git +pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang +pkg_mongodb_commit = master + +PACKAGES += mongooseim +pkg_mongooseim_name = mongooseim +pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions +pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform +pkg_mongooseim_fetch = git +pkg_mongooseim_repo = https://github.com/esl/MongooseIM +pkg_mongooseim_commit = master + +PACKAGES += moyo +pkg_moyo_name = moyo +pkg_moyo_description = Erlang utility functions library +pkg_moyo_homepage = https://github.com/dwango/moyo +pkg_moyo_fetch = git +pkg_moyo_repo = https://github.com/dwango/moyo +pkg_moyo_commit = master + +PACKAGES += msgpack +pkg_msgpack_name = msgpack +pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang +pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang +pkg_msgpack_fetch = git +pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang +pkg_msgpack_commit = master + +PACKAGES += mu2 +pkg_mu2_name = mu2 +pkg_mu2_description = Erlang mutation testing tool +pkg_mu2_homepage = https://github.com/ramsay-t/mu2 +pkg_mu2_fetch = git +pkg_mu2_repo = https://github.com/ramsay-t/mu2 +pkg_mu2_commit = master + +PACKAGES += mustache +pkg_mustache_name = mustache +pkg_mustache_description = Mustache template engine for Erlang. +pkg_mustache_homepage = https://github.com/mojombo/mustache.erl +pkg_mustache_fetch = git +pkg_mustache_repo = https://github.com/mojombo/mustache.erl +pkg_mustache_commit = master + +PACKAGES += myproto +pkg_myproto_name = myproto +pkg_myproto_description = MySQL Server Protocol in Erlang +pkg_myproto_homepage = https://github.com/altenwald/myproto +pkg_myproto_fetch = git +pkg_myproto_repo = https://github.com/altenwald/myproto +pkg_myproto_commit = master + +PACKAGES += mysql +pkg_mysql_name = mysql +pkg_mysql_description = Erlang MySQL Driver (from code.google.com) +pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver +pkg_mysql_fetch = git +pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver +pkg_mysql_commit = master + +PACKAGES += n2o +pkg_n2o_name = n2o +pkg_n2o_description = WebSocket Application Server +pkg_n2o_homepage = https://github.com/5HT/n2o +pkg_n2o_fetch = git +pkg_n2o_repo = https://github.com/5HT/n2o +pkg_n2o_commit = master + +PACKAGES += nat_upnp +pkg_nat_upnp_name = nat_upnp +pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD +pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp +pkg_nat_upnp_fetch = git +pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp +pkg_nat_upnp_commit = master + +PACKAGES += neo4j +pkg_neo4j_name = neo4j +pkg_neo4j_description = Erlang client library for Neo4J. +pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang +pkg_neo4j_fetch = git +pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang +pkg_neo4j_commit = master + +PACKAGES += neotoma +pkg_neotoma_name = neotoma +pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars. +pkg_neotoma_homepage = https://github.com/seancribbs/neotoma +pkg_neotoma_fetch = git +pkg_neotoma_repo = https://github.com/seancribbs/neotoma +pkg_neotoma_commit = master + +PACKAGES += newrelic +pkg_newrelic_name = newrelic +pkg_newrelic_description = Erlang library for sending metrics to New Relic +pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang +pkg_newrelic_fetch = git +pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang +pkg_newrelic_commit = master + +PACKAGES += nifty +pkg_nifty_name = nifty +pkg_nifty_description = Erlang NIF wrapper generator +pkg_nifty_homepage = https://github.com/parapluu/nifty +pkg_nifty_fetch = git +pkg_nifty_repo = https://github.com/parapluu/nifty +pkg_nifty_commit = master + +PACKAGES += nitrogen_core +pkg_nitrogen_core_name = nitrogen_core +pkg_nitrogen_core_description = The core Nitrogen library. +pkg_nitrogen_core_homepage = http://nitrogenproject.com/ +pkg_nitrogen_core_fetch = git +pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core +pkg_nitrogen_core_commit = master + +PACKAGES += nkbase +pkg_nkbase_name = nkbase +pkg_nkbase_description = NkBASE distributed database +pkg_nkbase_homepage = https://github.com/Nekso/nkbase +pkg_nkbase_fetch = git +pkg_nkbase_repo = https://github.com/Nekso/nkbase +pkg_nkbase_commit = develop + +PACKAGES += nkdocker +pkg_nkdocker_name = nkdocker +pkg_nkdocker_description = Erlang Docker client +pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker +pkg_nkdocker_fetch = git +pkg_nkdocker_repo = https://github.com/Nekso/nkdocker +pkg_nkdocker_commit = master + +PACKAGES += nkpacket +pkg_nkpacket_name = nkpacket +pkg_nkpacket_description = Generic Erlang transport layer +pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket +pkg_nkpacket_fetch = git +pkg_nkpacket_repo = https://github.com/Nekso/nkpacket +pkg_nkpacket_commit = master + +PACKAGES += nksip +pkg_nksip_name = nksip +pkg_nksip_description = Erlang SIP application server +pkg_nksip_homepage = https://github.com/kalta/nksip +pkg_nksip_fetch = git +pkg_nksip_repo = https://github.com/kalta/nksip +pkg_nksip_commit = master + +PACKAGES += nodefinder +pkg_nodefinder_name = nodefinder +pkg_nodefinder_description = automatic node discovery via UDP multicast +pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder +pkg_nodefinder_fetch = git +pkg_nodefinder_repo = https://github.com/okeuday/nodefinder +pkg_nodefinder_commit = master + +PACKAGES += nprocreg +pkg_nprocreg_name = nprocreg +pkg_nprocreg_description = Minimal Distributed Erlang Process Registry +pkg_nprocreg_homepage = http://nitrogenproject.com/ +pkg_nprocreg_fetch = git +pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg +pkg_nprocreg_commit = master + +PACKAGES += oauth2 +pkg_oauth2_name = oauth2 +pkg_oauth2_description = Erlang Oauth2 implementation +pkg_oauth2_homepage = https://github.com/kivra/oauth2 +pkg_oauth2_fetch = git +pkg_oauth2_repo = https://github.com/kivra/oauth2 +pkg_oauth2_commit = master + +PACKAGES += oauth +pkg_oauth_name = oauth +pkg_oauth_description = An Erlang OAuth 1.0 implementation +pkg_oauth_homepage = https://github.com/tim/erlang-oauth +pkg_oauth_fetch = git +pkg_oauth_repo = https://github.com/tim/erlang-oauth +pkg_oauth_commit = master + +PACKAGES += octopus +pkg_octopus_name = octopus +pkg_octopus_description = Small and flexible pool manager written in Erlang +pkg_octopus_homepage = https://github.com/erlangbureau/octopus +pkg_octopus_fetch = git +pkg_octopus_repo = https://github.com/erlangbureau/octopus +pkg_octopus_commit = 1.0.0 + +PACKAGES += of_protocol +pkg_of_protocol_name = of_protocol +pkg_of_protocol_description = OpenFlow Protocol Library for Erlang +pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol +pkg_of_protocol_fetch = git +pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol +pkg_of_protocol_commit = master + +PACKAGES += opencouch +pkg_opencouch_name = couch +pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB +pkg_opencouch_homepage = https://github.com/benoitc/opencouch +pkg_opencouch_fetch = git +pkg_opencouch_repo = https://github.com/benoitc/opencouch +pkg_opencouch_commit = master + +PACKAGES += openflow +pkg_openflow_name = openflow +pkg_openflow_description = An OpenFlow controller written in pure erlang +pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow +pkg_openflow_fetch = git +pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow +pkg_openflow_commit = master + +PACKAGES += openid +pkg_openid_name = openid +pkg_openid_description = Erlang OpenID +pkg_openid_homepage = https://github.com/brendonh/erl_openid +pkg_openid_fetch = git +pkg_openid_repo = https://github.com/brendonh/erl_openid +pkg_openid_commit = master + +PACKAGES += openpoker +pkg_openpoker_name = openpoker +pkg_openpoker_description = Genesis Texas hold'em Game Server +pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker +pkg_openpoker_fetch = git +pkg_openpoker_repo = https://github.com/hpyhacking/openpoker +pkg_openpoker_commit = master + +PACKAGES += pal +pkg_pal_name = pal +pkg_pal_description = Pragmatic Authentication Library +pkg_pal_homepage = https://github.com/manifest/pal +pkg_pal_fetch = git +pkg_pal_repo = https://github.com/manifest/pal +pkg_pal_commit = master + +PACKAGES += parse_trans +pkg_parse_trans_name = parse_trans +pkg_parse_trans_description = Parse transform utilities for Erlang +pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans +pkg_parse_trans_fetch = git +pkg_parse_trans_repo = https://github.com/uwiger/parse_trans +pkg_parse_trans_commit = master + +PACKAGES += parsexml +pkg_parsexml_name = parsexml +pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API +pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml +pkg_parsexml_fetch = git +pkg_parsexml_repo = https://github.com/maxlapshin/parsexml +pkg_parsexml_commit = master + +PACKAGES += pegjs +pkg_pegjs_name = pegjs +pkg_pegjs_description = An implementation of PEG.js grammar for Erlang. +pkg_pegjs_homepage = https://github.com/dmitriid/pegjs +pkg_pegjs_fetch = git +pkg_pegjs_repo = https://github.com/dmitriid/pegjs +pkg_pegjs_commit = 0.3 + +PACKAGES += percept2 +pkg_percept2_name = percept2 +pkg_percept2_description = Concurrent profiling tool for Erlang +pkg_percept2_homepage = https://github.com/huiqing/percept2 +pkg_percept2_fetch = git +pkg_percept2_repo = https://github.com/huiqing/percept2 +pkg_percept2_commit = master + +PACKAGES += pgsql +pkg_pgsql_name = pgsql +pkg_pgsql_description = Erlang PostgreSQL driver +pkg_pgsql_homepage = https://github.com/semiocast/pgsql +pkg_pgsql_fetch = git +pkg_pgsql_repo = https://github.com/semiocast/pgsql +pkg_pgsql_commit = master + +PACKAGES += pkgx +pkg_pkgx_name = pkgx +pkg_pkgx_description = Build .deb packages from Erlang releases +pkg_pkgx_homepage = https://github.com/arjan/pkgx +pkg_pkgx_fetch = git +pkg_pkgx_repo = https://github.com/arjan/pkgx +pkg_pkgx_commit = master + +PACKAGES += pkt +pkg_pkt_name = pkt +pkg_pkt_description = Erlang network protocol library +pkg_pkt_homepage = https://github.com/msantos/pkt +pkg_pkt_fetch = git +pkg_pkt_repo = https://github.com/msantos/pkt +pkg_pkt_commit = master + +PACKAGES += plain_fsm +pkg_plain_fsm_name = plain_fsm +pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs. +pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm +pkg_plain_fsm_fetch = git +pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm +pkg_plain_fsm_commit = master + +PACKAGES += plumtree +pkg_plumtree_name = plumtree +pkg_plumtree_description = Epidemic Broadcast Trees +pkg_plumtree_homepage = https://github.com/helium/plumtree +pkg_plumtree_fetch = git +pkg_plumtree_repo = https://github.com/helium/plumtree +pkg_plumtree_commit = master + +PACKAGES += pmod_transform +pkg_pmod_transform_name = pmod_transform +pkg_pmod_transform_description = Parse transform for parameterized modules +pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform +pkg_pmod_transform_fetch = git +pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform +pkg_pmod_transform_commit = master + +PACKAGES += pobox +pkg_pobox_name = pobox +pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang +pkg_pobox_homepage = https://github.com/ferd/pobox +pkg_pobox_fetch = git +pkg_pobox_repo = https://github.com/ferd/pobox +pkg_pobox_commit = master + +PACKAGES += ponos +pkg_ponos_name = ponos +pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang +pkg_ponos_homepage = https://github.com/klarna/ponos +pkg_ponos_fetch = git +pkg_ponos_repo = https://github.com/klarna/ponos +pkg_ponos_commit = master + +PACKAGES += poolboy +pkg_poolboy_name = poolboy +pkg_poolboy_description = A hunky Erlang worker pool factory +pkg_poolboy_homepage = https://github.com/devinus/poolboy +pkg_poolboy_fetch = git +pkg_poolboy_repo = https://github.com/devinus/poolboy +pkg_poolboy_commit = master + +PACKAGES += pooler +pkg_pooler_name = pooler +pkg_pooler_description = An OTP Process Pool Application +pkg_pooler_homepage = https://github.com/seth/pooler +pkg_pooler_fetch = git +pkg_pooler_repo = https://github.com/seth/pooler +pkg_pooler_commit = master + +PACKAGES += pqueue +pkg_pqueue_name = pqueue +pkg_pqueue_description = Erlang Priority Queues +pkg_pqueue_homepage = https://github.com/okeuday/pqueue +pkg_pqueue_fetch = git +pkg_pqueue_repo = https://github.com/okeuday/pqueue +pkg_pqueue_commit = master + +PACKAGES += procket +pkg_procket_name = procket +pkg_procket_description = Erlang interface to low level socket operations +pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket +pkg_procket_fetch = git +pkg_procket_repo = https://github.com/msantos/procket +pkg_procket_commit = master + +PACKAGES += proper +pkg_proper_name = proper +pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang. +pkg_proper_homepage = http://proper.softlab.ntua.gr +pkg_proper_fetch = git +pkg_proper_repo = https://github.com/manopapad/proper +pkg_proper_commit = master + +PACKAGES += prop +pkg_prop_name = prop +pkg_prop_description = An Erlang code scaffolding and generator system. +pkg_prop_homepage = https://github.com/nuex/prop +pkg_prop_fetch = git +pkg_prop_repo = https://github.com/nuex/prop +pkg_prop_commit = master + +PACKAGES += props +pkg_props_name = props +pkg_props_description = Property structure library +pkg_props_homepage = https://github.com/greyarea/props +pkg_props_fetch = git +pkg_props_repo = https://github.com/greyarea/props +pkg_props_commit = master + +PACKAGES += protobuffs +pkg_protobuffs_name = protobuffs +pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs. +pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs +pkg_protobuffs_fetch = git +pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs +pkg_protobuffs_commit = master + +PACKAGES += psycho +pkg_psycho_name = psycho +pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware. +pkg_psycho_homepage = https://github.com/gar1t/psycho +pkg_psycho_fetch = git +pkg_psycho_repo = https://github.com/gar1t/psycho +pkg_psycho_commit = master + +PACKAGES += purity +pkg_purity_name = purity +pkg_purity_description = A side-effect analyzer for Erlang +pkg_purity_homepage = https://github.com/mpitid/purity +pkg_purity_fetch = git +pkg_purity_repo = https://github.com/mpitid/purity +pkg_purity_commit = master + +PACKAGES += push_service +pkg_push_service_name = push_service +pkg_push_service_description = Push service +pkg_push_service_homepage = https://github.com/hairyhum/push_service +pkg_push_service_fetch = git +pkg_push_service_repo = https://github.com/hairyhum/push_service +pkg_push_service_commit = master + +PACKAGES += qdate +pkg_qdate_name = qdate +pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang. +pkg_qdate_homepage = https://github.com/choptastic/qdate +pkg_qdate_fetch = git +pkg_qdate_repo = https://github.com/choptastic/qdate +pkg_qdate_commit = 0.4.0 + +PACKAGES += qrcode +pkg_qrcode_name = qrcode +pkg_qrcode_description = QR Code encoder in Erlang +pkg_qrcode_homepage = https://github.com/komone/qrcode +pkg_qrcode_fetch = git +pkg_qrcode_repo = https://github.com/komone/qrcode +pkg_qrcode_commit = master + +PACKAGES += quest +pkg_quest_name = quest +pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang. +pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest +pkg_quest_fetch = git +pkg_quest_repo = https://github.com/eriksoe/ErlangQuest +pkg_quest_commit = master + +PACKAGES += quickrand +pkg_quickrand_name = quickrand +pkg_quickrand_description = Quick Erlang Random Number Generation +pkg_quickrand_homepage = https://github.com/okeuday/quickrand +pkg_quickrand_fetch = git +pkg_quickrand_repo = https://github.com/okeuday/quickrand +pkg_quickrand_commit = master + +PACKAGES += rabbit_exchange_type_riak +pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak +pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak +pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange +pkg_rabbit_exchange_type_riak_fetch = git +pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange +pkg_rabbit_exchange_type_riak_commit = master + +PACKAGES += rabbit +pkg_rabbit_name = rabbit +pkg_rabbit_description = RabbitMQ Server +pkg_rabbit_homepage = https://www.rabbitmq.com/ +pkg_rabbit_fetch = git +pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git +pkg_rabbit_commit = master + +PACKAGES += rack +pkg_rack_name = rack +pkg_rack_description = Rack handler for erlang +pkg_rack_homepage = https://github.com/erlyvideo/rack +pkg_rack_fetch = git +pkg_rack_repo = https://github.com/erlyvideo/rack +pkg_rack_commit = master + +PACKAGES += radierl +pkg_radierl_name = radierl +pkg_radierl_description = RADIUS protocol stack implemented in Erlang. +pkg_radierl_homepage = https://github.com/vances/radierl +pkg_radierl_fetch = git +pkg_radierl_repo = https://github.com/vances/radierl +pkg_radierl_commit = master + +PACKAGES += rafter +pkg_rafter_name = rafter +pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol +pkg_rafter_homepage = https://github.com/andrewjstone/rafter +pkg_rafter_fetch = git +pkg_rafter_repo = https://github.com/andrewjstone/rafter +pkg_rafter_commit = master + +PACKAGES += ranch +pkg_ranch_name = ranch +pkg_ranch_description = Socket acceptor pool for TCP protocols. +pkg_ranch_homepage = http://ninenines.eu +pkg_ranch_fetch = git +pkg_ranch_repo = https://github.com/ninenines/ranch +pkg_ranch_commit = 1.1.0 + +PACKAGES += rbeacon +pkg_rbeacon_name = rbeacon +pkg_rbeacon_description = LAN discovery and presence in Erlang. +pkg_rbeacon_homepage = https://github.com/refuge/rbeacon +pkg_rbeacon_fetch = git +pkg_rbeacon_repo = https://github.com/refuge/rbeacon +pkg_rbeacon_commit = master + +PACKAGES += rebar +pkg_rebar_name = rebar +pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases. +pkg_rebar_homepage = http://www.rebar3.org +pkg_rebar_fetch = git +pkg_rebar_repo = https://github.com/rebar/rebar3 +pkg_rebar_commit = master + +PACKAGES += rebus +pkg_rebus_name = rebus +pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang. +pkg_rebus_homepage = https://github.com/olle/rebus +pkg_rebus_fetch = git +pkg_rebus_repo = https://github.com/olle/rebus +pkg_rebus_commit = master + +PACKAGES += rec2json +pkg_rec2json_name = rec2json +pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily. +pkg_rec2json_homepage = https://github.com/lordnull/rec2json +pkg_rec2json_fetch = git +pkg_rec2json_repo = https://github.com/lordnull/rec2json +pkg_rec2json_commit = master + +PACKAGES += recon +pkg_recon_name = recon +pkg_recon_description = Collection of functions and scripts to debug Erlang in production. +pkg_recon_homepage = https://github.com/ferd/recon +pkg_recon_fetch = git +pkg_recon_repo = https://github.com/ferd/recon +pkg_recon_commit = 2.2.1 + +PACKAGES += record_info +pkg_record_info_name = record_info +pkg_record_info_description = Convert between record and proplist +pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info +pkg_record_info_fetch = git +pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info +pkg_record_info_commit = master + +PACKAGES += redgrid +pkg_redgrid_name = redgrid +pkg_redgrid_description = automatic Erlang node discovery via redis +pkg_redgrid_homepage = https://github.com/jkvor/redgrid +pkg_redgrid_fetch = git +pkg_redgrid_repo = https://github.com/jkvor/redgrid +pkg_redgrid_commit = master + +PACKAGES += redo +pkg_redo_name = redo +pkg_redo_description = pipelined erlang redis client +pkg_redo_homepage = https://github.com/jkvor/redo +pkg_redo_fetch = git +pkg_redo_repo = https://github.com/jkvor/redo +pkg_redo_commit = master + +PACKAGES += reload_mk +pkg_reload_mk_name = reload_mk +pkg_reload_mk_description = Live reload plugin for erlang.mk. +pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk +pkg_reload_mk_fetch = git +pkg_reload_mk_repo = https://github.com/bullno1/reload.mk +pkg_reload_mk_commit = master + +PACKAGES += reltool_util +pkg_reltool_util_name = reltool_util +pkg_reltool_util_description = Erlang reltool utility functionality application +pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util +pkg_reltool_util_fetch = git +pkg_reltool_util_repo = https://github.com/okeuday/reltool_util +pkg_reltool_util_commit = master + +PACKAGES += relx +pkg_relx_name = relx +pkg_relx_description = Sane, simple release creation for Erlang +pkg_relx_homepage = https://github.com/erlware/relx +pkg_relx_fetch = git +pkg_relx_repo = https://github.com/erlware/relx +pkg_relx_commit = master + +PACKAGES += resource_discovery +pkg_resource_discovery_name = resource_discovery +pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster. +pkg_resource_discovery_homepage = http://erlware.org/ +pkg_resource_discovery_fetch = git +pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery +pkg_resource_discovery_commit = master + +PACKAGES += restc +pkg_restc_name = restc +pkg_restc_description = Erlang Rest Client +pkg_restc_homepage = https://github.com/kivra/restclient +pkg_restc_fetch = git +pkg_restc_repo = https://github.com/kivra/restclient +pkg_restc_commit = master + +PACKAGES += rfc4627_jsonrpc +pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc +pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation. +pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627 +pkg_rfc4627_jsonrpc_fetch = git +pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627 +pkg_rfc4627_jsonrpc_commit = master + +PACKAGES += riakc +pkg_riakc_name = riakc +pkg_riakc_description = Erlang clients for Riak. +pkg_riakc_homepage = https://github.com/basho/riak-erlang-client +pkg_riakc_fetch = git +pkg_riakc_repo = https://github.com/basho/riak-erlang-client +pkg_riakc_commit = master + +PACKAGES += riak_control +pkg_riak_control_name = riak_control +pkg_riak_control_description = Webmachine-based administration interface for Riak. +pkg_riak_control_homepage = https://github.com/basho/riak_control +pkg_riak_control_fetch = git +pkg_riak_control_repo = https://github.com/basho/riak_control +pkg_riak_control_commit = master + +PACKAGES += riak_core +pkg_riak_core_name = riak_core +pkg_riak_core_description = Distributed systems infrastructure used by Riak. +pkg_riak_core_homepage = https://github.com/basho/riak_core +pkg_riak_core_fetch = git +pkg_riak_core_repo = https://github.com/basho/riak_core +pkg_riak_core_commit = master + +PACKAGES += riak_dt +pkg_riak_dt_name = riak_dt +pkg_riak_dt_description = Convergent replicated datatypes in Erlang +pkg_riak_dt_homepage = https://github.com/basho/riak_dt +pkg_riak_dt_fetch = git +pkg_riak_dt_repo = https://github.com/basho/riak_dt +pkg_riak_dt_commit = master + +PACKAGES += riak_ensemble +pkg_riak_ensemble_name = riak_ensemble +pkg_riak_ensemble_description = Multi-Paxos framework in Erlang +pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble +pkg_riak_ensemble_fetch = git +pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble +pkg_riak_ensemble_commit = master + +PACKAGES += riakhttpc +pkg_riakhttpc_name = riakhttpc +pkg_riakhttpc_description = Riak Erlang client using the HTTP interface +pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client +pkg_riakhttpc_fetch = git +pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client +pkg_riakhttpc_commit = master + +PACKAGES += riak_kv +pkg_riak_kv_name = riak_kv +pkg_riak_kv_description = Riak Key/Value Store +pkg_riak_kv_homepage = https://github.com/basho/riak_kv +pkg_riak_kv_fetch = git +pkg_riak_kv_repo = https://github.com/basho/riak_kv +pkg_riak_kv_commit = master + +PACKAGES += riaknostic +pkg_riaknostic_name = riaknostic +pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap +pkg_riaknostic_homepage = https://github.com/basho/riaknostic +pkg_riaknostic_fetch = git +pkg_riaknostic_repo = https://github.com/basho/riaknostic +pkg_riaknostic_commit = master + +PACKAGES += riak_pg +pkg_riak_pg_name = riak_pg +pkg_riak_pg_description = Distributed process groups with riak_core. +pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg +pkg_riak_pg_fetch = git +pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg +pkg_riak_pg_commit = master + +PACKAGES += riak_pipe +pkg_riak_pipe_name = riak_pipe +pkg_riak_pipe_description = Riak Pipelines +pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe +pkg_riak_pipe_fetch = git +pkg_riak_pipe_repo = https://github.com/basho/riak_pipe +pkg_riak_pipe_commit = master + +PACKAGES += riakpool +pkg_riakpool_name = riakpool +pkg_riakpool_description = erlang riak client pool +pkg_riakpool_homepage = https://github.com/dweldon/riakpool +pkg_riakpool_fetch = git +pkg_riakpool_repo = https://github.com/dweldon/riakpool +pkg_riakpool_commit = master + +PACKAGES += riak_sysmon +pkg_riak_sysmon_name = riak_sysmon +pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages +pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon +pkg_riak_sysmon_fetch = git +pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon +pkg_riak_sysmon_commit = master + +PACKAGES += riak_test +pkg_riak_test_name = riak_test +pkg_riak_test_description = I'm in your cluster, testing your riaks +pkg_riak_test_homepage = https://github.com/basho/riak_test +pkg_riak_test_fetch = git +pkg_riak_test_repo = https://github.com/basho/riak_test +pkg_riak_test_commit = master + +PACKAGES += rivus_cep +pkg_rivus_cep_name = rivus_cep +pkg_rivus_cep_description = Complex event processing in Erlang +pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep +pkg_rivus_cep_fetch = git +pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep +pkg_rivus_cep_commit = master + +PACKAGES += rlimit +pkg_rlimit_name = rlimit +pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent +pkg_rlimit_homepage = https://github.com/jlouis/rlimit +pkg_rlimit_fetch = git +pkg_rlimit_repo = https://github.com/jlouis/rlimit +pkg_rlimit_commit = master + +PACKAGES += safetyvalve +pkg_safetyvalve_name = safetyvalve +pkg_safetyvalve_description = A safety valve for your erlang node +pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve +pkg_safetyvalve_fetch = git +pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve +pkg_safetyvalve_commit = master + +PACKAGES += seestar +pkg_seestar_name = seestar +pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol +pkg_seestar_homepage = https://github.com/iamaleksey/seestar +pkg_seestar_fetch = git +pkg_seestar_repo = https://github.com/iamaleksey/seestar +pkg_seestar_commit = master + +PACKAGES += service +pkg_service_name = service +pkg_service_description = A minimal Erlang behavior for creating CloudI internal services +pkg_service_homepage = http://cloudi.org/ +pkg_service_fetch = git +pkg_service_repo = https://github.com/CloudI/service +pkg_service_commit = master + +PACKAGES += setup +pkg_setup_name = setup +pkg_setup_description = Generic setup utility for Erlang-based systems +pkg_setup_homepage = https://github.com/uwiger/setup +pkg_setup_fetch = git +pkg_setup_repo = https://github.com/uwiger/setup +pkg_setup_commit = master + +PACKAGES += sext +pkg_sext_name = sext +pkg_sext_description = Sortable Erlang Term Serialization +pkg_sext_homepage = https://github.com/uwiger/sext +pkg_sext_fetch = git +pkg_sext_repo = https://github.com/uwiger/sext +pkg_sext_commit = master + +PACKAGES += sfmt +pkg_sfmt_name = sfmt +pkg_sfmt_description = SFMT pseudo random number generator for Erlang. +pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang +pkg_sfmt_fetch = git +pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang +pkg_sfmt_commit = master + +PACKAGES += sgte +pkg_sgte_name = sgte +pkg_sgte_description = A simple Erlang Template Engine +pkg_sgte_homepage = https://github.com/filippo/sgte +pkg_sgte_fetch = git +pkg_sgte_repo = https://github.com/filippo/sgte +pkg_sgte_commit = master + +PACKAGES += sheriff +pkg_sheriff_name = sheriff +pkg_sheriff_description = Parse transform for type based validation. +pkg_sheriff_homepage = http://ninenines.eu +pkg_sheriff_fetch = git +pkg_sheriff_repo = https://github.com/extend/sheriff +pkg_sheriff_commit = master + +PACKAGES += shotgun +pkg_shotgun_name = shotgun +pkg_shotgun_description = better than just a gun +pkg_shotgun_homepage = https://github.com/inaka/shotgun +pkg_shotgun_fetch = git +pkg_shotgun_repo = https://github.com/inaka/shotgun +pkg_shotgun_commit = 0.1.0 + +PACKAGES += sidejob +pkg_sidejob_name = sidejob +pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang +pkg_sidejob_homepage = https://github.com/basho/sidejob +pkg_sidejob_fetch = git +pkg_sidejob_repo = https://github.com/basho/sidejob +pkg_sidejob_commit = master + +PACKAGES += sieve +pkg_sieve_name = sieve +pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang +pkg_sieve_homepage = https://github.com/benoitc/sieve +pkg_sieve_fetch = git +pkg_sieve_repo = https://github.com/benoitc/sieve +pkg_sieve_commit = master + +PACKAGES += sighandler +pkg_sighandler_name = sighandler +pkg_sighandler_description = Handle UNIX signals in Er lang +pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler +pkg_sighandler_fetch = git +pkg_sighandler_repo = https://github.com/jkingsbery/sighandler +pkg_sighandler_commit = master + +PACKAGES += simhash +pkg_simhash_name = simhash +pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data. +pkg_simhash_homepage = https://github.com/ferd/simhash +pkg_simhash_fetch = git +pkg_simhash_repo = https://github.com/ferd/simhash +pkg_simhash_commit = master + +PACKAGES += simple_bridge +pkg_simple_bridge_name = simple_bridge +pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers. +pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge +pkg_simple_bridge_fetch = git +pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge +pkg_simple_bridge_commit = master + +PACKAGES += simple_oauth2 +pkg_simple_oauth2_name = simple_oauth2 +pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured) +pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2 +pkg_simple_oauth2_fetch = git +pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2 +pkg_simple_oauth2_commit = master + +PACKAGES += skel +pkg_skel_name = skel +pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang +pkg_skel_homepage = https://github.com/ParaPhrase/skel +pkg_skel_fetch = git +pkg_skel_repo = https://github.com/ParaPhrase/skel +pkg_skel_commit = master + +PACKAGES += slack +pkg_slack_name = slack +pkg_slack_description = Minimal slack notification OTP library. +pkg_slack_homepage = https://github.com/DonBranson/slack +pkg_slack_fetch = git +pkg_slack_repo = https://github.com/DonBranson/slack.git +pkg_slack_commit = 1.0.0 + +PACKAGES += smother +pkg_smother_name = smother +pkg_smother_description = Extended code coverage metrics for Erlang. +pkg_smother_homepage = https://ramsay-t.github.io/Smother/ +pkg_smother_fetch = git +pkg_smother_repo = https://github.com/ramsay-t/Smother +pkg_smother_commit = master + +PACKAGES += social +pkg_social_name = social +pkg_social_description = Cowboy handler for social login via OAuth2 providers +pkg_social_homepage = https://github.com/dvv/social +pkg_social_fetch = git +pkg_social_repo = https://github.com/dvv/social +pkg_social_commit = master + +PACKAGES += spapi_router +pkg_spapi_router_name = spapi_router +pkg_spapi_router_description = Partially-connected Erlang clustering +pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router +pkg_spapi_router_fetch = git +pkg_spapi_router_repo = https://github.com/spilgames/spapi-router +pkg_spapi_router_commit = master + +PACKAGES += sqerl +pkg_sqerl_name = sqerl +pkg_sqerl_description = An Erlang-flavoured SQL DSL +pkg_sqerl_homepage = https://github.com/hairyhum/sqerl +pkg_sqerl_fetch = git +pkg_sqerl_repo = https://github.com/hairyhum/sqerl +pkg_sqerl_commit = master + +PACKAGES += srly +pkg_srly_name = srly +pkg_srly_description = Native Erlang Unix serial interface +pkg_srly_homepage = https://github.com/msantos/srly +pkg_srly_fetch = git +pkg_srly_repo = https://github.com/msantos/srly +pkg_srly_commit = master + +PACKAGES += sshrpc +pkg_sshrpc_name = sshrpc +pkg_sshrpc_description = Erlang SSH RPC module (experimental) +pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc +pkg_sshrpc_fetch = git +pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc +pkg_sshrpc_commit = master + +PACKAGES += stable +pkg_stable_name = stable +pkg_stable_description = Library of assorted helpers for Cowboy web server. +pkg_stable_homepage = https://github.com/dvv/stable +pkg_stable_fetch = git +pkg_stable_repo = https://github.com/dvv/stable +pkg_stable_commit = master + +PACKAGES += statebox +pkg_statebox_name = statebox +pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak. +pkg_statebox_homepage = https://github.com/mochi/statebox +pkg_statebox_fetch = git +pkg_statebox_repo = https://github.com/mochi/statebox +pkg_statebox_commit = master + +PACKAGES += statebox_riak +pkg_statebox_riak_name = statebox_riak +pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media. +pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak +pkg_statebox_riak_fetch = git +pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak +pkg_statebox_riak_commit = master + +PACKAGES += statman +pkg_statman_name = statman +pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM +pkg_statman_homepage = https://github.com/knutin/statman +pkg_statman_fetch = git +pkg_statman_repo = https://github.com/knutin/statman +pkg_statman_commit = master + +PACKAGES += statsderl +pkg_statsderl_name = statsderl +pkg_statsderl_description = StatsD client (erlang) +pkg_statsderl_homepage = https://github.com/lpgauth/statsderl +pkg_statsderl_fetch = git +pkg_statsderl_repo = https://github.com/lpgauth/statsderl +pkg_statsderl_commit = master + +PACKAGES += stdinout_pool +pkg_stdinout_pool_name = stdinout_pool +pkg_stdinout_pool_description = stdinout_pool : stuff goes in, stuff goes out. there's never any miscommunication. +pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool +pkg_stdinout_pool_fetch = git +pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool +pkg_stdinout_pool_commit = master + +PACKAGES += stockdb +pkg_stockdb_name = stockdb +pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang +pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb +pkg_stockdb_fetch = git +pkg_stockdb_repo = https://github.com/maxlapshin/stockdb +pkg_stockdb_commit = master + +PACKAGES += stripe +pkg_stripe_name = stripe +pkg_stripe_description = Erlang interface to the stripe.com API +pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang +pkg_stripe_fetch = git +pkg_stripe_repo = https://github.com/mattsta/stripe-erlang +pkg_stripe_commit = v1 + +PACKAGES += supervisor3 +pkg_supervisor3_name = supervisor3 +pkg_supervisor3_description = OTP supervisor with additional strategies +pkg_supervisor3_homepage = https://github.com/klarna/supervisor3 +pkg_supervisor3_fetch = git +pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git +pkg_supervisor3_commit = master + +PACKAGES += surrogate +pkg_surrogate_name = surrogate +pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes. +pkg_surrogate_homepage = https://github.com/skruger/Surrogate +pkg_surrogate_fetch = git +pkg_surrogate_repo = https://github.com/skruger/Surrogate +pkg_surrogate_commit = master + +PACKAGES += swab +pkg_swab_name = swab +pkg_swab_description = General purpose buffer handling module +pkg_swab_homepage = https://github.com/crownedgrouse/swab +pkg_swab_fetch = git +pkg_swab_repo = https://github.com/crownedgrouse/swab +pkg_swab_commit = master + +PACKAGES += swarm +pkg_swarm_name = swarm +pkg_swarm_description = Fast and simple acceptor pool for Erlang +pkg_swarm_homepage = https://github.com/jeremey/swarm +pkg_swarm_fetch = git +pkg_swarm_repo = https://github.com/jeremey/swarm +pkg_swarm_commit = master + +PACKAGES += switchboard +pkg_switchboard_name = switchboard +pkg_switchboard_description = A framework for processing email using worker plugins. +pkg_switchboard_homepage = https://github.com/thusfresh/switchboard +pkg_switchboard_fetch = git +pkg_switchboard_repo = https://github.com/thusfresh/switchboard +pkg_switchboard_commit = master + +PACKAGES += sync +pkg_sync_name = sync +pkg_sync_description = On-the-fly recompiling and reloading in Erlang. +pkg_sync_homepage = https://github.com/rustyio/sync +pkg_sync_fetch = git +pkg_sync_repo = https://github.com/rustyio/sync +pkg_sync_commit = master + +PACKAGES += syn +pkg_syn_name = syn +pkg_syn_description = A global process registry for Erlang. +pkg_syn_homepage = https://github.com/ostinelli/syn +pkg_syn_fetch = git +pkg_syn_repo = https://github.com/ostinelli/syn +pkg_syn_commit = master + +PACKAGES += syntaxerl +pkg_syntaxerl_name = syntaxerl +pkg_syntaxerl_description = Syntax checker for Erlang +pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl +pkg_syntaxerl_fetch = git +pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl +pkg_syntaxerl_commit = master + +PACKAGES += syslog +pkg_syslog_name = syslog +pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3) +pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog +pkg_syslog_fetch = git +pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog +pkg_syslog_commit = master + +PACKAGES += taskforce +pkg_taskforce_name = taskforce +pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks. +pkg_taskforce_homepage = https://github.com/g-andrade/taskforce +pkg_taskforce_fetch = git +pkg_taskforce_repo = https://github.com/g-andrade/taskforce +pkg_taskforce_commit = master + +PACKAGES += tddreloader +pkg_tddreloader_name = tddreloader +pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes +pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader +pkg_tddreloader_fetch = git +pkg_tddreloader_repo = https://github.com/version2beta/tddreloader +pkg_tddreloader_commit = master + +PACKAGES += tempo +pkg_tempo_name = tempo +pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang. +pkg_tempo_homepage = https://github.com/selectel/tempo +pkg_tempo_fetch = git +pkg_tempo_repo = https://github.com/selectel/tempo +pkg_tempo_commit = master + +PACKAGES += ticktick +pkg_ticktick_name = ticktick +pkg_ticktick_description = Ticktick is an id generator for message service. +pkg_ticktick_homepage = https://github.com/ericliang/ticktick +pkg_ticktick_fetch = git +pkg_ticktick_repo = https://github.com/ericliang/ticktick +pkg_ticktick_commit = master + +PACKAGES += tinymq +pkg_tinymq_name = tinymq +pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue +pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq +pkg_tinymq_fetch = git +pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq +pkg_tinymq_commit = master + +PACKAGES += tinymt +pkg_tinymt_name = tinymt +pkg_tinymt_description = TinyMT pseudo random number generator for Erlang. +pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang +pkg_tinymt_fetch = git +pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang +pkg_tinymt_commit = master + +PACKAGES += tirerl +pkg_tirerl_name = tirerl +pkg_tirerl_description = Erlang interface to Elastic Search +pkg_tirerl_homepage = https://github.com/inaka/tirerl +pkg_tirerl_fetch = git +pkg_tirerl_repo = https://github.com/inaka/tirerl +pkg_tirerl_commit = master + +PACKAGES += traffic_tools +pkg_traffic_tools_name = traffic_tools +pkg_traffic_tools_description = Simple traffic limiting library +pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools +pkg_traffic_tools_fetch = git +pkg_traffic_tools_repo = https://github.com/systra/traffic_tools +pkg_traffic_tools_commit = master + +PACKAGES += trails +pkg_trails_name = trails +pkg_trails_description = A couple of improvements over Cowboy Routes +pkg_trails_homepage = http://inaka.github.io/cowboy-trails/ +pkg_trails_fetch = git +pkg_trails_repo = https://github.com/inaka/cowboy-trails +pkg_trails_commit = master + +PACKAGES += trane +pkg_trane_name = trane +pkg_trane_description = SAX style broken HTML parser in Erlang +pkg_trane_homepage = https://github.com/massemanet/trane +pkg_trane_fetch = git +pkg_trane_repo = https://github.com/massemanet/trane +pkg_trane_commit = master + +PACKAGES += transit +pkg_transit_name = transit +pkg_transit_description = transit format for erlang +pkg_transit_homepage = https://github.com/isaiah/transit-erlang +pkg_transit_fetch = git +pkg_transit_repo = https://github.com/isaiah/transit-erlang +pkg_transit_commit = master + +PACKAGES += trie +pkg_trie_name = trie +pkg_trie_description = Erlang Trie Implementation +pkg_trie_homepage = https://github.com/okeuday/trie +pkg_trie_fetch = git +pkg_trie_repo = https://github.com/okeuday/trie +pkg_trie_commit = master + +PACKAGES += triq +pkg_triq_name = triq +pkg_triq_description = Trifork QuickCheck +pkg_triq_homepage = https://github.com/krestenkrab/triq +pkg_triq_fetch = git +pkg_triq_repo = https://github.com/krestenkrab/triq +pkg_triq_commit = master + +PACKAGES += tunctl +pkg_tunctl_name = tunctl +pkg_tunctl_description = Erlang TUN/TAP interface +pkg_tunctl_homepage = https://github.com/msantos/tunctl +pkg_tunctl_fetch = git +pkg_tunctl_repo = https://github.com/msantos/tunctl +pkg_tunctl_commit = master + +PACKAGES += twerl +pkg_twerl_name = twerl +pkg_twerl_description = Erlang client for the Twitter Streaming API +pkg_twerl_homepage = https://github.com/lucaspiller/twerl +pkg_twerl_fetch = git +pkg_twerl_repo = https://github.com/lucaspiller/twerl +pkg_twerl_commit = oauth + +PACKAGES += twitter_erlang +pkg_twitter_erlang_name = twitter_erlang +pkg_twitter_erlang_description = An Erlang twitter client +pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter +pkg_twitter_erlang_fetch = git +pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter +pkg_twitter_erlang_commit = master + +PACKAGES += ucol_nif +pkg_ucol_nif_name = ucol_nif +pkg_ucol_nif_description = ICU based collation Erlang module +pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif +pkg_ucol_nif_fetch = git +pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif +pkg_ucol_nif_commit = master + +PACKAGES += unicorn +pkg_unicorn_name = unicorn +pkg_unicorn_description = Generic configuration server +pkg_unicorn_homepage = https://github.com/shizzard/unicorn +pkg_unicorn_fetch = git +pkg_unicorn_repo = https://github.com/shizzard/unicorn +pkg_unicorn_commit = 0.3.0 + +PACKAGES += unsplit +pkg_unsplit_name = unsplit +pkg_unsplit_description = Resolves conflicts in Mnesia after network splits +pkg_unsplit_homepage = https://github.com/uwiger/unsplit +pkg_unsplit_fetch = git +pkg_unsplit_repo = https://github.com/uwiger/unsplit +pkg_unsplit_commit = master + +PACKAGES += uuid +pkg_uuid_name = uuid +pkg_uuid_description = Erlang UUID Implementation +pkg_uuid_homepage = https://github.com/okeuday/uuid +pkg_uuid_fetch = git +pkg_uuid_repo = https://github.com/okeuday/uuid +pkg_uuid_commit = v1.4.0 + +PACKAGES += ux +pkg_ux_name = ux +pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation) +pkg_ux_homepage = https://github.com/erlang-unicode/ux +pkg_ux_fetch = git +pkg_ux_repo = https://github.com/erlang-unicode/ux +pkg_ux_commit = master + +PACKAGES += vert +pkg_vert_name = vert +pkg_vert_description = Erlang binding to libvirt virtualization API +pkg_vert_homepage = https://github.com/msantos/erlang-libvirt +pkg_vert_fetch = git +pkg_vert_repo = https://github.com/msantos/erlang-libvirt +pkg_vert_commit = master + +PACKAGES += verx +pkg_verx_name = verx +pkg_verx_description = Erlang implementation of the libvirtd remote protocol +pkg_verx_homepage = https://github.com/msantos/verx +pkg_verx_fetch = git +pkg_verx_repo = https://github.com/msantos/verx +pkg_verx_commit = master + +PACKAGES += vmq_acl +pkg_vmq_acl_name = vmq_acl +pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_acl_homepage = https://verne.mq/ +pkg_vmq_acl_fetch = git +pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl +pkg_vmq_acl_commit = master + +PACKAGES += vmq_bridge +pkg_vmq_bridge_name = vmq_bridge +pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_bridge_homepage = https://verne.mq/ +pkg_vmq_bridge_fetch = git +pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge +pkg_vmq_bridge_commit = master + +PACKAGES += vmq_graphite +pkg_vmq_graphite_name = vmq_graphite +pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_graphite_homepage = https://verne.mq/ +pkg_vmq_graphite_fetch = git +pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite +pkg_vmq_graphite_commit = master + +PACKAGES += vmq_passwd +pkg_vmq_passwd_name = vmq_passwd +pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_passwd_homepage = https://verne.mq/ +pkg_vmq_passwd_fetch = git +pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd +pkg_vmq_passwd_commit = master + +PACKAGES += vmq_server +pkg_vmq_server_name = vmq_server +pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_server_homepage = https://verne.mq/ +pkg_vmq_server_fetch = git +pkg_vmq_server_repo = https://github.com/erlio/vmq_server +pkg_vmq_server_commit = master + +PACKAGES += vmq_snmp +pkg_vmq_snmp_name = vmq_snmp +pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_snmp_homepage = https://verne.mq/ +pkg_vmq_snmp_fetch = git +pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp +pkg_vmq_snmp_commit = master + +PACKAGES += vmq_systree +pkg_vmq_systree_name = vmq_systree +pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker +pkg_vmq_systree_homepage = https://verne.mq/ +pkg_vmq_systree_fetch = git +pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree +pkg_vmq_systree_commit = master + +PACKAGES += vmstats +pkg_vmstats_name = vmstats +pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs. +pkg_vmstats_homepage = https://github.com/ferd/vmstats +pkg_vmstats_fetch = git +pkg_vmstats_repo = https://github.com/ferd/vmstats +pkg_vmstats_commit = master + +PACKAGES += walrus +pkg_walrus_name = walrus +pkg_walrus_description = Walrus - Mustache-like Templating +pkg_walrus_homepage = https://github.com/devinus/walrus +pkg_walrus_fetch = git +pkg_walrus_repo = https://github.com/devinus/walrus +pkg_walrus_commit = master + +PACKAGES += webmachine +pkg_webmachine_name = webmachine +pkg_webmachine_description = A REST-based system for building web applications. +pkg_webmachine_homepage = https://github.com/basho/webmachine +pkg_webmachine_fetch = git +pkg_webmachine_repo = https://github.com/basho/webmachine +pkg_webmachine_commit = master + +PACKAGES += websocket_client +pkg_websocket_client_name = websocket_client +pkg_websocket_client_description = Erlang websocket client (ws and wss supported) +pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client +pkg_websocket_client_fetch = git +pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client +pkg_websocket_client_commit = master + +PACKAGES += worker_pool +pkg_worker_pool_name = worker_pool +pkg_worker_pool_description = a simple erlang worker pool +pkg_worker_pool_homepage = https://github.com/inaka/worker_pool +pkg_worker_pool_fetch = git +pkg_worker_pool_repo = https://github.com/inaka/worker_pool +pkg_worker_pool_commit = 1.0.3 + +PACKAGES += wrangler +pkg_wrangler_name = wrangler +pkg_wrangler_description = Import of the Wrangler svn repository. +pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html +pkg_wrangler_fetch = git +pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler +pkg_wrangler_commit = master + +PACKAGES += wsock +pkg_wsock_name = wsock +pkg_wsock_description = Erlang library to build WebSocket clients and servers +pkg_wsock_homepage = https://github.com/madtrick/wsock +pkg_wsock_fetch = git +pkg_wsock_repo = https://github.com/madtrick/wsock +pkg_wsock_commit = master + +PACKAGES += xhttpc +pkg_xhttpc_name = xhttpc +pkg_xhttpc_description = Extensible HTTP Client for Erlang +pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc +pkg_xhttpc_fetch = git +pkg_xhttpc_repo = https://github.com/seriyps/xhttpc +pkg_xhttpc_commit = master + +PACKAGES += xref_runner +pkg_xref_runner_name = xref_runner +pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref) +pkg_xref_runner_homepage = https://github.com/inaka/xref_runner +pkg_xref_runner_fetch = git +pkg_xref_runner_repo = https://github.com/inaka/xref_runner +pkg_xref_runner_commit = 0.2.3 + +PACKAGES += yamerl +pkg_yamerl_name = yamerl +pkg_yamerl_description = YAML 1.2 parser in pure Erlang +pkg_yamerl_homepage = https://github.com/yakaz/yamerl +pkg_yamerl_fetch = git +pkg_yamerl_repo = https://github.com/yakaz/yamerl +pkg_yamerl_commit = master + +PACKAGES += yamler +pkg_yamler_name = yamler +pkg_yamler_description = libyaml-based yaml loader for Erlang +pkg_yamler_homepage = https://github.com/goertzenator/yamler +pkg_yamler_fetch = git +pkg_yamler_repo = https://github.com/goertzenator/yamler +pkg_yamler_commit = master + +PACKAGES += yaws +pkg_yaws_name = yaws +pkg_yaws_description = Yaws webserver +pkg_yaws_homepage = http://yaws.hyber.org +pkg_yaws_fetch = git +pkg_yaws_repo = https://github.com/klacke/yaws +pkg_yaws_commit = master + +PACKAGES += zab_engine +pkg_zab_engine_name = zab_engine +pkg_zab_engine_description = zab propotocol implement by erlang +pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine +pkg_zab_engine_fetch = git +pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine +pkg_zab_engine_commit = master + +PACKAGES += zeta +pkg_zeta_name = zeta +pkg_zeta_description = HTTP access log parser in Erlang +pkg_zeta_homepage = https://github.com/s1n4/zeta +pkg_zeta_fetch = git +pkg_zeta_repo = https://github.com/s1n4/zeta +pkg_zeta_commit = + +PACKAGES += zippers +pkg_zippers_name = zippers +pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers +pkg_zippers_homepage = https://github.com/ferd/zippers +pkg_zippers_fetch = git +pkg_zippers_repo = https://github.com/ferd/zippers +pkg_zippers_commit = master + +PACKAGES += zlists +pkg_zlists_name = zlists +pkg_zlists_description = Erlang lazy lists library. +pkg_zlists_homepage = https://github.com/vjache/erlang-zlists +pkg_zlists_fetch = git +pkg_zlists_repo = https://github.com/vjache/erlang-zlists +pkg_zlists_commit = master + +PACKAGES += zraft_lib +pkg_zraft_lib_name = zraft_lib +pkg_zraft_lib_description = Erlang raft consensus protocol implementation +pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib +pkg_zraft_lib_fetch = git +pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib +pkg_zraft_lib_commit = master + +PACKAGES += zucchini +pkg_zucchini_name = zucchini +pkg_zucchini_description = An Erlang INI parser +pkg_zucchini_homepage = https://github.com/devinus/zucchini +pkg_zucchini_fetch = git +pkg_zucchini_repo = https://github.com/devinus/zucchini +pkg_zucchini_commit = master + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: search + +define pkg_print + $(verbose) printf "%s\n" \ + $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name: $(1)") \ + "App name: $(pkg_$(1)_name)" \ + "Description: $(pkg_$(1)_description)" \ + "Home page: $(pkg_$(1)_homepage)" \ + "Fetch with: $(pkg_$(1)_fetch)" \ + "Repository: $(pkg_$(1)_repo)" \ + "Commit: $(pkg_$(1)_commit)" \ + "" + +endef + +search: +ifdef q + $(foreach p,$(PACKAGES), \ + $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \ + $(call pkg_print,$(p)))) +else + $(foreach p,$(PACKAGES),$(call pkg_print,$(p))) +endif + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: distclean-deps + +# Configuration. + +ifdef OTP_DEPS +$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.) +endif + +IGNORE_DEPS ?= +export IGNORE_DEPS + +APPS_DIR ?= $(CURDIR)/apps +export APPS_DIR + +DEPS_DIR ?= $(CURDIR)/deps +export DEPS_DIR + +REBAR_DEPS_DIR = $(DEPS_DIR) +export REBAR_DEPS_DIR + +dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1))) +dep_repo = $(patsubst git://github.com/%,https://github.com/%, \ + $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo))) +dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit))) + +ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d))) +ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep)))) + +ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),) +ifeq ($(ERL_LIBS),) + ERL_LIBS = $(APPS_DIR):$(DEPS_DIR) +else + ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR) +endif +endif +export ERL_LIBS + +export NO_AUTOPATCH + +# Verbosity. + +dep_verbose_0 = @echo " DEP " $(1); +dep_verbose_2 = set -x; +dep_verbose = $(dep_verbose_$(V)) + +# Core targets. + +ifneq ($(SKIP_DEPS),) +deps:: +else +deps:: $(ALL_DEPS_DIRS) +ifndef IS_APP + $(verbose) for dep in $(ALL_APPS_DIRS) ; do \ + $(MAKE) -C $$dep IS_APP=1 || exit $$?; \ + done +endif +ifneq ($(IS_DEP),1) + $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log +endif + $(verbose) mkdir -p $(ERLANG_MK_TMP) + $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \ + if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \ + :; \ + else \ + echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \ + if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \ + $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \ + else \ + echo "Error: No Makefile to build dependency $$dep."; \ + exit 2; \ + fi \ + fi \ + done +endif + +# Deps related targets. + +# @todo rename GNUmakefile and makefile into Makefile first, if they exist +# While Makefile file could be GNUmakefile or makefile, +# in practice only Makefile is needed so far. +define dep_autopatch + if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \ + $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \ + $(call dep_autopatch_erlang_mk,$(1)); \ + elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \ + if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \ + $(call dep_autopatch2,$(1)); \ + elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \ + $(call dep_autopatch2,$(1)); \ + elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \ + $(call dep_autopatch2,$(1)); \ + else \ + $(call erlang,$(call dep_autopatch_app.erl,$(1))); \ + fi \ + else \ + if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \ + $(call dep_autopatch_noop,$(1)); \ + else \ + $(call dep_autopatch2,$(1)); \ + fi \ + fi +endef + +define dep_autopatch2 + if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \ + $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \ + fi; \ + $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \ + if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \ + $(call dep_autopatch_fetch_rebar); \ + $(call dep_autopatch_rebar,$(1)); \ + else \ + $(call dep_autopatch_gen,$(1)); \ + fi +endef + +define dep_autopatch_noop + printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile +endef + +# Overwrite erlang.mk with the current file by default. +ifeq ($(NO_AUTOPATCH_ERLANG_MK),) +define dep_autopatch_erlang_mk + echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \ + > $(DEPS_DIR)/$1/erlang.mk +endef +else +define dep_autopatch_erlang_mk + : +endef +endif + +define dep_autopatch_gen + printf "%s\n" \ + "ERLC_OPTS = +debug_info" \ + "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile +endef + +define dep_autopatch_fetch_rebar + mkdir -p $(ERLANG_MK_TMP); \ + if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \ + git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \ + cd $(ERLANG_MK_TMP)/rebar; \ + git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \ + $(MAKE); \ + cd -; \ + fi +endef + +define dep_autopatch_rebar + if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \ + mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \ + fi; \ + $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \ + rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app +endef + +define dep_autopatch_rebar.erl + application:load(rebar), + application:set_env(rebar, log_level, debug), + Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of + {ok, Conf0} -> Conf0; + _ -> [] + end, + {Conf, OsEnv} = fun() -> + case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of + false -> {Conf1, []}; + true -> + Bindings0 = erl_eval:new_bindings(), + Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0), + Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1), + Before = os:getenv(), + {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings), + {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)} + end + end(), + Write = fun (Text) -> + file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append]) + end, + Escape = fun (Text) -> + re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}]) + end, + Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package " + "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"), + Write("C_SRC_DIR = /path/do/not/exist\n"), + Write("C_SRC_TYPE = rebar\n"), + Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"), + Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]), + fun() -> + Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"), + case lists:keyfind(erl_opts, 1, Conf) of + false -> ok; + {_, ErlOpts} -> + lists:foreach(fun + ({d, D}) -> + Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n"); + ({i, I}) -> + Write(["ERLC_OPTS += -I ", I, "\n"]); + ({platform_define, Regex, D}) -> + case rebar_utils:is_arch(Regex) of + true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n"); + false -> ok + end; + ({parse_transform, PT}) -> + Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n"); + (_) -> ok + end, ErlOpts) + end, + Write("\n") + end(), + fun() -> + File = case lists:keyfind(deps, 1, Conf) of + false -> []; + {_, Deps} -> + [begin case case Dep of + {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}}; + {N, S} when is_tuple(S) -> {N, S}; + {N, _, S} -> {N, S}; + {N, _, S, _} -> {N, S}; + _ -> false + end of + false -> ok; + {Name, Source} -> + {Method, Repo, Commit} = case Source of + {hex, V} -> {hex, V, undefined}; + {git, R} -> {git, R, master}; + {M, R, {branch, C}} -> {M, R, C}; + {M, R, {ref, C}} -> {M, R, C}; + {M, R, {tag, C}} -> {M, R, C}; + {M, R, C} -> {M, R, C} + end, + Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit])) + end end || Dep <- Deps] + end + end(), + fun() -> + case lists:keyfind(erl_first_files, 1, Conf) of + false -> ok; + {_, Files} -> + Names = [[" ", case lists:reverse(F) of + "lre." ++ Elif -> lists:reverse(Elif); + Elif -> lists:reverse(Elif) + end] || "src/" ++ F <- Files], + Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names])) + end + end(), + Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"), + Write("\npreprocess::\n"), + Write("\npre-deps::\n"), + Write("\npre-app::\n"), + PatchHook = fun(Cmd) -> + case Cmd of + "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1); + "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1); + "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1); + "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1); + _ -> Escape(Cmd) + end + end, + fun() -> + case lists:keyfind(pre_hooks, 1, Conf) of + false -> ok; + {_, Hooks} -> + [case H of + {'get-deps', Cmd} -> + Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n"); + {compile, Cmd} -> + Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n"); + {Regex, compile, Cmd} -> + case rebar_utils:is_arch(Regex) of + true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n"); + false -> ok + end; + _ -> ok + end || H <- Hooks] + end + end(), + ShellToMk = fun(V) -> + re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]), + "-Werror\\\\b", "", [{return, list}, global]) + end, + PortSpecs = fun() -> + case lists:keyfind(port_specs, 1, Conf) of + false -> + case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of + false -> []; + true -> + [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"), + proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}] + end; + {_, Specs} -> + lists:flatten([case S of + {Output, Input} -> {ShellToMk(Output), Input, []}; + {Regex, Output, Input} -> + case rebar_utils:is_arch(Regex) of + true -> {ShellToMk(Output), Input, []}; + false -> [] + end; + {Regex, Output, Input, [{env, Env}]} -> + case rebar_utils:is_arch(Regex) of + true -> {ShellToMk(Output), Input, Env}; + false -> [] + end + end || S <- Specs]) + end + end(), + PortSpecWrite = fun (Text) -> + file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append]) + end, + case PortSpecs of + [] -> ok; + _ -> + Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"), + PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n", + [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])), + PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n", + [code:lib_dir(erl_interface, lib)])), + [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv], + FilterEnv = fun(Env) -> + lists:flatten([case E of + {_, _} -> E; + {Regex, K, V} -> + case rebar_utils:is_arch(Regex) of + true -> {K, V}; + false -> [] + end + end || E <- Env]) + end, + MergeEnv = fun(Env) -> + lists:foldl(fun ({K, V}, Acc) -> + case lists:keyfind(K, 1, Acc) of + false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc]; + {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc] + end + end, [], Env) + end, + PortEnv = case lists:keyfind(port_env, 1, Conf) of + false -> []; + {_, PortEnv0} -> FilterEnv(PortEnv0) + end, + PortSpec = fun ({Output, Input0, Env}) -> + filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output), + Input = [[" ", I] || I <- Input0], + PortSpecWrite([ + [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))], + case $(PLATFORM) of + darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress"; + _ -> "" + end, + "\n\nall:: ", Output, "\n\n", + "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n", + "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n", + "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n", + "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n", + [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))], + Output, ": $$\(foreach ext,.c .C .cc .cpp,", + "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n", + "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)", + case {filename:extension(Output), $(PLATFORM)} of + {[], _} -> "\n"; + {_, darwin} -> "\n"; + _ -> " -shared\n" + end]) + end, + [PortSpec(S) || S <- PortSpecs] + end, + Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"), + RunPlugin = fun(Plugin, Step) -> + case erlang:function_exported(Plugin, Step, 2) of + false -> ok; + true -> + c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"), + Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(), + dict:store(base_dir, "", dict:new())}, undefined), + io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret]) + end + end, + fun() -> + case lists:keyfind(plugins, 1, Conf) of + false -> ok; + {_, Plugins} -> + [begin + case lists:keyfind(deps, 1, Conf) of + false -> ok; + {_, Deps} -> + case lists:keyfind(P, 1, Deps) of + false -> ok; + _ -> + Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P), + io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]), + io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]), + code:add_patha(Path ++ "/ebin") + end + end + end || P <- Plugins], + [case code:load_file(P) of + {module, P} -> ok; + _ -> + case lists:keyfind(plugin_dir, 1, Conf) of + false -> ok; + {_, PluginsDir} -> + ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl", + {ok, P, Bin} = compile:file(ErlFile, [binary]), + {module, P} = code:load_binary(P, ErlFile, Bin) + end + end || P <- Plugins], + [RunPlugin(P, preprocess) || P <- Plugins], + [RunPlugin(P, pre_compile) || P <- Plugins], + [RunPlugin(P, compile) || P <- Plugins] + end + end(), + halt() +endef + +define dep_autopatch_app.erl + UpdateModules = fun(App) -> + case filelib:is_regular(App) of + false -> ok; + true -> + {ok, [{application, '$(1)', L0}]} = file:consult(App), + Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true, + fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []), + L = lists:keystore(modules, 1, L0, {modules, Mods}), + ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}])) + end + end, + UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"), + halt() +endef + +define dep_autopatch_appsrc_script.erl + AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)", + AppSrcScript = AppSrc ++ ".script", + Bindings = erl_eval:new_bindings(), + {ok, Conf} = file:script(AppSrcScript, Bindings), + ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])), + halt() +endef + +define dep_autopatch_appsrc.erl + AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)", + AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end, + case filelib:is_regular(AppSrcIn) of + false -> ok; + true -> + {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn), + L1 = lists:keystore(modules, 1, L0, {modules, []}), + L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end, + L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end, + ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])), + case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end + end, + halt() +endef + +define dep_fetch_git + git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \ + cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1)); +endef + +define dep_fetch_git-submodule + git submodule update --init -- $(DEPS_DIR)/$1; +endef + +define dep_fetch_hg + hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \ + cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1)); +endef + +define dep_fetch_svn + svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); +endef + +define dep_fetch_cp + cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); +endef + +define dep_fetch_hex.erl + ssl:start(), + inets:start(), + {ok, {{_, 200, _}, _, Body}} = httpc:request(get, + {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []}, + [], [{body_format, binary}]), + {ok, Files} = erl_tar:extract({binary, Body}, [memory]), + {_, Source} = lists:keyfind("contents.tar.gz", 1, Files), + ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]), + halt() +endef + +# Hex only has a package version. No need to look in the Erlang.mk packages. +define dep_fetch_hex + $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1)))))); +endef + +define dep_fetch_fail + echo "Error: Unknown or invalid dependency: $(1)." >&2; \ + exit 78; +endef + +# Kept for compatibility purposes with older Erlang.mk configuration. +define dep_fetch_legacy + $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \ + git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \ + cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master); +endef + +define dep_fetch + $(if $(dep_$(1)), \ + $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \ + $(word 1,$(dep_$(1))), \ + $(if $(IS_DEP),legacy,fail)), \ + $(if $(filter $(1),$(PACKAGES)), \ + $(pkg_$(1)_fetch), \ + fail)) +endef + +define dep_target +$(DEPS_DIR)/$(call dep_name,$1): + $(eval DEP_NAME := $(call dep_name,$1)) + $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))")) + $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \ + echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \ + exit 17; \ + fi + $(verbose) mkdir -p $(DEPS_DIR) + $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1)) + $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \ + && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \ + echo " AUTO " $(1); \ + cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \ + fi + - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \ + echo " CONF " $(DEP_STR); \ + cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \ + fi +ifeq ($(filter $(1),$(NO_AUTOPATCH)),) + $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \ + if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \ + echo " PATCH Downloading rabbitmq-codegen"; \ + git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \ + fi; \ + if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \ + echo " PATCH Downloading rabbitmq-server"; \ + git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \ + fi; \ + ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \ + elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \ + if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \ + echo " PATCH Downloading rabbitmq-codegen"; \ + git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \ + fi \ + else \ + $$(call dep_autopatch,$(DEP_NAME)) \ + fi +endif +endef + +$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep)))) + +ifndef IS_APP +clean:: clean-apps + +clean-apps: + $(verbose) for dep in $(ALL_APPS_DIRS) ; do \ + $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \ + done + +distclean:: distclean-apps + +distclean-apps: + $(verbose) for dep in $(ALL_APPS_DIRS) ; do \ + $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \ + done +endif + +ifndef SKIP_DEPS +distclean:: distclean-deps + +distclean-deps: + $(gen_verbose) rm -rf $(DEPS_DIR) +endif + +# External plugins. + +DEP_PLUGINS ?= + +define core_dep_plugin +-include $(DEPS_DIR)/$(1) + +$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ; +endef + +$(foreach p,$(DEP_PLUGINS),\ + $(eval $(if $(findstring /,$p),\ + $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\ + $(call core_dep_plugin,$p/plugins.mk,$p)))) + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +# Configuration. + +DTL_FULL_PATH ?= +DTL_PATH ?= templates/ +DTL_SUFFIX ?= _dtl + +# Verbosity. + +dtl_verbose_0 = @echo " DTL " $(filter %.dtl,$(?F)); +dtl_verbose = $(dtl_verbose_$(V)) + +# Core targets. + +DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl)) + +ifneq ($(DTL_FILES),) + +ifdef DTL_FULL_PATH +BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%)))) +else +BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES)))) +endif + +# Rebuild templates when the Makefile changes. +$(DTL_FILES): $(MAKEFILE_LIST) + @touch $@ + +define erlydtl_compile.erl + [begin + Module0 = case "$(strip $(DTL_FULL_PATH))" of + "" -> + filename:basename(F, ".dtl"); + _ -> + "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"), + re:replace(F2, "/", "_", [{return, list}, global]) + end, + Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"), + case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of + ok -> ok; + {ok, _} -> ok + end + end || F <- string:tokens("$(1)", " ")], + halt(). +endef + +ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/ + $(if $(strip $?),\ + $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)) + +endif + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +# Verbosity. + +proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F)); +proto_verbose = $(proto_verbose_$(V)) + +# Core targets. + +define compile_proto + $(verbose) mkdir -p ebin/ include/ + $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1))) + $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl + $(verbose) rm ebin/*.erl +endef + +define compile_proto.erl + [begin + Dir = filename:dirname(filename:dirname(F)), + protobuffs_compile:generate_source(F, + [{output_include_dir, Dir ++ "/include"}, + {output_src_dir, Dir ++ "/ebin"}]) + end || F <- string:tokens("$(1)", " ")], + halt(). +endef + +ifneq ($(wildcard src/),) +ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto)) + $(if $(strip $?),$(call compile_proto,$?)) +endif + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: clean-app + +# Configuration. + +ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \ + +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec +COMPILE_FIRST ?= +COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST))) +ERLC_EXCLUDE ?= +ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE))) + +ERLC_MIB_OPTS ?= +COMPILE_MIB_FIRST ?= +COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST))) + +# Verbosity. + +app_verbose_0 = @echo " APP " $(PROJECT); +app_verbose_2 = set -x; +app_verbose = $(app_verbose_$(V)) + +appsrc_verbose_0 = @echo " APP " $(PROJECT).app.src; +appsrc_verbose_2 = set -x; +appsrc_verbose = $(appsrc_verbose_$(V)) + +makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d; +makedep_verbose_2 = set -x; +makedep_verbose = $(makedep_verbose_$(V)) + +erlc_verbose_0 = @echo " ERLC " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\ + $(filter %.erl %.core,$(?F))); +erlc_verbose_2 = set -x; +erlc_verbose = $(erlc_verbose_$(V)) + +xyrl_verbose_0 = @echo " XYRL " $(filter %.xrl %.yrl,$(?F)); +xyrl_verbose_2 = set -x; +xyrl_verbose = $(xyrl_verbose_$(V)) + +asn1_verbose_0 = @echo " ASN1 " $(filter %.asn1,$(?F)); +asn1_verbose_2 = set -x; +asn1_verbose = $(asn1_verbose_$(V)) + +mib_verbose_0 = @echo " MIB " $(filter %.bin %.mib,$(?F)); +mib_verbose_2 = set -x; +mib_verbose = $(mib_verbose_$(V)) + +ifneq ($(wildcard src/),) + +# Targets. + +ifeq ($(wildcard ebin/test),) +app:: deps $(PROJECT).d + $(verbose) $(MAKE) --no-print-directory app-build +else +app:: clean deps $(PROJECT).d + $(verbose) $(MAKE) --no-print-directory app-build +endif + +ifeq ($(wildcard src/$(PROJECT)_app.erl),) +define app_file +{application, $(PROJECT), [ + {description, "$(PROJECT_DESCRIPTION)"}, + {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP), + {id$(comma)$(space)"$(1)"}$(comma)) + {modules, [$(call comma_list,$(2))]}, + {registered, []}, + {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]} +]}. +endef +else +define app_file +{application, $(PROJECT), [ + {description, "$(PROJECT_DESCRIPTION)"}, + {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP), + {id$(comma)$(space)"$(1)"}$(comma)) + {modules, [$(call comma_list,$(2))]}, + {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]}, + {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}, + {mod, {$(PROJECT)_app, []}} +]}. +endef +endif + +app-build: ebin/$(PROJECT).app + $(verbose) : + +# Source files. + +ERL_FILES = $(sort $(call core_find,src/,*.erl)) +CORE_FILES = $(sort $(call core_find,src/,*.core)) + +# ASN.1 files. + +ifneq ($(wildcard asn1/),) +ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1)) +ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES)))) + +define compile_asn1 + $(verbose) mkdir -p include/ + $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1) + $(verbose) mv asn1/*.erl src/ + $(verbose) mv asn1/*.hrl include/ + $(verbose) mv asn1/*.asn1db include/ +endef + +$(PROJECT).d:: $(ASN1_FILES) + $(if $(strip $?),$(call compile_asn1,$?)) +endif + +# SNMP MIB files. + +ifneq ($(wildcard mibs/),) +MIB_FILES = $(sort $(call core_find,mibs/,*.mib)) + +$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES) + $(verbose) mkdir -p include/ priv/mibs/ + $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $? + $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?))) +endif + +# Leex and Yecc files. + +XRL_FILES = $(sort $(call core_find,src/,*.xrl)) +XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES)))) +ERL_FILES += $(XRL_ERL_FILES) + +YRL_FILES = $(sort $(call core_find,src/,*.yrl)) +YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES)))) +ERL_FILES += $(YRL_ERL_FILES) + +$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES) + $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?) + +# Erlang and Core Erlang files. + +define makedep.erl + E = ets:new(makedep, [bag]), + G = digraph:new([acyclic]), + ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")), + Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles], + Add = fun (Mod, Dep) -> + case lists:keyfind(Dep, 1, Modules) of + false -> ok; + {_, DepFile} -> + {_, ModFile} = lists:keyfind(Mod, 1, Modules), + ets:insert(E, {ModFile, DepFile}), + digraph:add_vertex(G, Mod), + digraph:add_vertex(G, Dep), + digraph:add_edge(G, Mod, Dep) + end + end, + AddHd = fun (F, Mod, DepFile) -> + case file:open(DepFile, [read]) of + {error, enoent} -> ok; + {ok, Fd} -> + F(F, Fd, Mod), + {_, ModFile} = lists:keyfind(Mod, 1, Modules), + ets:insert(E, {ModFile, DepFile}) + end + end, + Attr = fun + (F, Mod, behavior, Dep) -> Add(Mod, Dep); + (F, Mod, behaviour, Dep) -> Add(Mod, Dep); + (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep); + (F, Mod, compile, Opts) when is_list(Opts) -> + case proplists:get_value(parse_transform, Opts) of + undefined -> ok; + Dep -> Add(Mod, Dep) + end; + (F, Mod, include, Hrl) -> + case filelib:is_file("include/" ++ Hrl) of + true -> AddHd(F, Mod, "include/" ++ Hrl); + false -> + case filelib:is_file("src/" ++ Hrl) of + true -> AddHd(F, Mod, "src/" ++ Hrl); + false -> false + end + end; + (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl); + (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl); + (F, Mod, import, {Imp, _}) -> + case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of + false -> ok; + true -> Add(Mod, Imp) + end; + (_, _, _, _) -> ok + end, + MakeDepend = fun(F, Fd, Mod) -> + case io:parse_erl_form(Fd, undefined) of + {ok, {attribute, _, Key, Value}, _} -> + Attr(F, Mod, Key, Value), + F(F, Fd, Mod); + {eof, _} -> + file:close(Fd); + _ -> + F(F, Fd, Mod) + end + end, + [begin + Mod = list_to_atom(filename:basename(F, ".erl")), + {ok, Fd} = file:open(F, [read]), + MakeDepend(MakeDepend, Fd, Mod) + end || F <- ErlFiles], + Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))), + CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)], + ok = file:write_file("$(1)", [ + [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend], + "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n" + ]), + halt() +endef + +ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),) +$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) + $(makedep_verbose) $(call erlang,$(call makedep.erl,$@)) +endif + +# Rebuild everything when the Makefile changes. +$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(MAKEFILE_LIST) + @touch $@ + +-include $(PROJECT).d + +ebin/$(PROJECT).app:: ebin/ + +ebin/: + $(verbose) mkdir -p ebin/ + +define compile_erl + $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \ + -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1)) +endef + +ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src) + $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?)) + $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE))) + $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true)) + $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \ + $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES))))))) +ifeq ($(wildcard src/$(PROJECT).app.src),) + $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \ + > ebin/$(PROJECT).app +else + $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \ + echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \ + exit 1; \ + fi + $(appsrc_verbose) cat src/$(PROJECT).app.src \ + | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \ + | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \ + > ebin/$(PROJECT).app +endif + +clean:: clean-app + +clean-app: + $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \ + $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \ + $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \ + $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \ + $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES)))) + +endif + +# Copyright (c) 2015, Viktor Söderqvist +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: docs-deps + +# Configuration. + +ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS)) + +# Targets. + +$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep)))) + +ifneq ($(SKIP_DEPS),) +doc-deps: +else +doc-deps: $(ALL_DOC_DEPS_DIRS) + $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done +endif + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: rel-deps + +# Configuration. + +ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS)) + +# Targets. + +$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep)))) + +ifneq ($(SKIP_DEPS),) +rel-deps: +else +rel-deps: $(ALL_REL_DEPS_DIRS) + $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done +endif + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: test-deps test-dir test-build clean-test-dir + +# Configuration. + +TEST_DIR ?= $(CURDIR)/test + +ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS)) + +TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard +TEST_ERLC_OPTS += -DTEST=1 + +# Targets. + +$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep)))) + +ifneq ($(SKIP_DEPS),) +test-deps: +else +test-deps: $(ALL_TEST_DEPS_DIRS) + $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done +endif + +ifneq ($(wildcard $(TEST_DIR)),) +test-dir: + $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \ + $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/ +endif + +ifeq ($(wildcard src),) +test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS) +test-build:: clean deps test-deps + $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)" +else +ifeq ($(wildcard ebin/test),) +test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS) +test-build:: clean deps test-deps $(PROJECT).d + $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)" + $(gen_verbose) touch ebin/test +else +test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS) +test-build:: deps test-deps $(PROJECT).d + $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)" +endif + +clean:: clean-test-dir + +clean-test-dir: +ifneq ($(wildcard $(TEST_DIR)/*.beam),) + $(gen_verbose) rm -f $(TEST_DIR)/*.beam +endif +endif + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: rebar.config + +# We strip out -Werror because we don't want to fail due to +# warnings when used as a dependency. + +compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/') + +define compat_convert_erlc_opts +$(if $(filter-out -Werror,$1),\ + $(if $(findstring +,$1),\ + $(shell echo $1 | cut -b 2-))) +endef + +define compat_erlc_opts_to_list +[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))] +endef + +define compat_rebar_config +{deps, [$(call comma_list,$(foreach d,$(DEPS),\ + {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}. +{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}. +endef + +$(eval _compat_rebar_config = $$(compat_rebar_config)) +$(eval export _compat_rebar_config) + +rebar.config: + $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc + +MAN_INSTALL_PATH ?= /usr/local/share/man +MAN_SECTIONS ?= 3 7 + +docs:: asciidoc + +asciidoc: asciidoc-guide asciidoc-manual + +ifeq ($(wildcard doc/src/guide/book.asciidoc),) +asciidoc-guide: +else +asciidoc-guide: distclean-asciidoc doc-deps + a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf + a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/ +endif + +ifeq ($(wildcard doc/src/manual/*.asciidoc),) +asciidoc-manual: +else +asciidoc-manual: distclean-asciidoc doc-deps + for f in doc/src/manual/*.asciidoc ; do \ + a2x -v -f manpage $$f ; \ + done + for s in $(MAN_SECTIONS); do \ + mkdir -p doc/man$$s/ ; \ + mv doc/src/manual/*.$$s doc/man$$s/ ; \ + gzip doc/man$$s/*.$$s ; \ + done + +install-docs:: install-asciidoc + +install-asciidoc: asciidoc-manual + for s in $(MAN_SECTIONS); do \ + mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \ + install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \ + done +endif + +distclean:: distclean-asciidoc + +distclean-asciidoc: + $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/ + +# Copyright (c) 2014-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates + +# Core targets. + +help:: + $(verbose) printf "%s\n" "" \ + "Bootstrap targets:" \ + " bootstrap Generate a skeleton of an OTP application" \ + " bootstrap-lib Generate a skeleton of an OTP library" \ + " bootstrap-rel Generate the files needed to build a release" \ + " new-app n=NAME Create a new local OTP application NAME" \ + " new-lib n=NAME Create a new local OTP library NAME" \ + " new t=TPL n=NAME Generate a module NAME based on the template TPL" \ + " new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \ + " list-templates List available templates" + +# Bootstrap templates. + +define bs_appsrc +{application, $p, [ + {description, ""}, + {vsn, "0.1.0"}, + {id, "git"}, + {modules, []}, + {registered, []}, + {applications, [ + kernel, + stdlib + ]}, + {mod, {$p_app, []}}, + {env, []} +]}. +endef + +define bs_appsrc_lib +{application, $p, [ + {description, ""}, + {vsn, "0.1.0"}, + {id, "git"}, + {modules, []}, + {registered, []}, + {applications, [ + kernel, + stdlib + ]} +]}. +endef + +# To prevent autocompletion issues with ZSH, we add "include erlang.mk" +# separately during the actual bootstrap. +ifdef SP +define bs_Makefile +PROJECT = $p +PROJECT_DESCRIPTION = New project +PROJECT_VERSION = 0.0.1 + +# Whitespace to be used when creating files from templates. +SP = $(SP) + +endef +else +define bs_Makefile +PROJECT = $p +PROJECT_DESCRIPTION = New project +PROJECT_VERSION = 0.0.1 + +endef +endif + +define bs_apps_Makefile +PROJECT = $p +PROJECT_DESCRIPTION = New project +PROJECT_VERSION = 0.0.1 + +include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk +endef + +define bs_app +-module($p_app). +-behaviour(application). + +-export([start/2]). +-export([stop/1]). + +start(_Type, _Args) -> + $p_sup:start_link(). + +stop(_State) -> + ok. +endef + +define bs_relx_config +{release, {$p_release, "1"}, [$p]}. +{extended_start_script, true}. +{sys_config, "rel/sys.config"}. +{vm_args, "rel/vm.args"}. +endef + +define bs_sys_config +[ +]. +endef + +define bs_vm_args +-name $p@127.0.0.1 +-setcookie $p +-heart +endef + +# Normal templates. + +define tpl_supervisor +-module($(n)). +-behaviour(supervisor). + +-export([start_link/0]). +-export([init/1]). + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +init([]) -> + Procs = [], + {ok, {{one_for_one, 1, 5}, Procs}}. +endef + +define tpl_gen_server +-module($(n)). +-behaviour(gen_server). + +%% API. +-export([start_link/0]). + +%% gen_server. +-export([init/1]). +-export([handle_call/3]). +-export([handle_cast/2]). +-export([handle_info/2]). +-export([terminate/2]). +-export([code_change/3]). + +-record(state, { +}). + +%% API. + +-spec start_link() -> {ok, pid()}. +start_link() -> + gen_server:start_link(?MODULE, [], []). + +%% gen_server. + +init([]) -> + {ok, #state{}}. + +handle_call(_Request, _From, State) -> + {reply, ignored, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. +endef + +define tpl_cowboy_http +-module($(n)). +-behaviour(cowboy_http_handler). + +-export([init/3]). +-export([handle/2]). +-export([terminate/3]). + +-record(state, { +}). + +init(_, Req, _Opts) -> + {ok, Req, #state{}}. + +handle(Req, State=#state{}) -> + {ok, Req2} = cowboy_req:reply(200, Req), + {ok, Req2, State}. + +terminate(_Reason, _Req, _State) -> + ok. +endef + +define tpl_gen_fsm +-module($(n)). +-behaviour(gen_fsm). + +%% API. +-export([start_link/0]). + +%% gen_fsm. +-export([init/1]). +-export([state_name/2]). +-export([handle_event/3]). +-export([state_name/3]). +-export([handle_sync_event/4]). +-export([handle_info/3]). +-export([terminate/3]). +-export([code_change/4]). + +-record(state, { +}). + +%% API. + +-spec start_link() -> {ok, pid()}. +start_link() -> + gen_fsm:start_link(?MODULE, [], []). + +%% gen_fsm. + +init([]) -> + {ok, state_name, #state{}}. + +state_name(_Event, StateData) -> + {next_state, state_name, StateData}. + +handle_event(_Event, StateName, StateData) -> + {next_state, StateName, StateData}. + +state_name(_Event, _From, StateData) -> + {reply, ignored, state_name, StateData}. + +handle_sync_event(_Event, _From, StateName, StateData) -> + {reply, ignored, StateName, StateData}. + +handle_info(_Info, StateName, StateData) -> + {next_state, StateName, StateData}. + +terminate(_Reason, _StateName, _StateData) -> + ok. + +code_change(_OldVsn, StateName, StateData, _Extra) -> + {ok, StateName, StateData}. +endef + +define tpl_cowboy_loop +-module($(n)). +-behaviour(cowboy_loop_handler). + +-export([init/3]). +-export([info/3]). +-export([terminate/3]). + +-record(state, { +}). + +init(_, Req, _Opts) -> + {loop, Req, #state{}, 5000, hibernate}. + +info(_Info, Req, State) -> + {loop, Req, State, hibernate}. + +terminate(_Reason, _Req, _State) -> + ok. +endef + +define tpl_cowboy_rest +-module($(n)). + +-export([init/3]). +-export([content_types_provided/2]). +-export([get_html/2]). + +init(_, _Req, _Opts) -> + {upgrade, protocol, cowboy_rest}. + +content_types_provided(Req, State) -> + {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}. + +get_html(Req, State) -> + {<<"This is REST!">>, Req, State}. +endef + +define tpl_cowboy_ws +-module($(n)). +-behaviour(cowboy_websocket_handler). + +-export([init/3]). +-export([websocket_init/3]). +-export([websocket_handle/3]). +-export([websocket_info/3]). +-export([websocket_terminate/3]). + +-record(state, { +}). + +init(_, _, _) -> + {upgrade, protocol, cowboy_websocket}. + +websocket_init(_, Req, _Opts) -> + Req2 = cowboy_req:compact(Req), + {ok, Req2, #state{}}. + +websocket_handle({text, Data}, Req, State) -> + {reply, {text, Data}, Req, State}; +websocket_handle({binary, Data}, Req, State) -> + {reply, {binary, Data}, Req, State}; +websocket_handle(_Frame, Req, State) -> + {ok, Req, State}. + +websocket_info(_Info, Req, State) -> + {ok, Req, State}. + +websocket_terminate(_Reason, _Req, _State) -> + ok. +endef + +define tpl_ranch_protocol +-module($(n)). +-behaviour(ranch_protocol). + +-export([start_link/4]). +-export([init/4]). + +-type opts() :: []. +-export_type([opts/0]). + +-record(state, { + socket :: inet:socket(), + transport :: module() +}). + +start_link(Ref, Socket, Transport, Opts) -> + Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]), + {ok, Pid}. + +-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok. +init(Ref, Socket, Transport, _Opts) -> + ok = ranch:accept_ack(Ref), + loop(#state{socket=Socket, transport=Transport}). + +loop(State) -> + loop(State). +endef + +# Plugin-specific targets. + +define render_template + $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2) +endef + +ifndef WS +ifdef SP +WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a)) +else +WS = $(tab) +endif +endif + +bootstrap: +ifneq ($(wildcard src/),) + $(error Error: src/ directory already exists) +endif + $(eval p := $(PROJECT)) + $(eval n := $(PROJECT)_sup) + $(call render_template,bs_Makefile,Makefile) + $(verbose) echo "include erlang.mk" >> Makefile + $(verbose) mkdir src/ +ifdef LEGACY + $(call render_template,bs_appsrc,src/$(PROJECT).app.src) +endif + $(call render_template,bs_app,src/$(PROJECT)_app.erl) + $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl) + +bootstrap-lib: +ifneq ($(wildcard src/),) + $(error Error: src/ directory already exists) +endif + $(eval p := $(PROJECT)) + $(call render_template,bs_Makefile,Makefile) + $(verbose) echo "include erlang.mk" >> Makefile + $(verbose) mkdir src/ +ifdef LEGACY + $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src) +endif + +bootstrap-rel: +ifneq ($(wildcard relx.config),) + $(error Error: relx.config already exists) +endif +ifneq ($(wildcard rel/),) + $(error Error: rel/ directory already exists) +endif + $(eval p := $(PROJECT)) + $(call render_template,bs_relx_config,relx.config) + $(verbose) mkdir rel/ + $(call render_template,bs_sys_config,rel/sys.config) + $(call render_template,bs_vm_args,rel/vm.args) + +new-app: +ifndef in + $(error Usage: $(MAKE) new-app in=APP) +endif +ifneq ($(wildcard $(APPS_DIR)/$in),) + $(error Error: Application $in already exists) +endif + $(eval p := $(in)) + $(eval n := $(in)_sup) + $(verbose) mkdir -p $(APPS_DIR)/$p/src/ + $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile) +ifdef LEGACY + $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src) +endif + $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl) + $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl) + +new-lib: +ifndef in + $(error Usage: $(MAKE) new-lib in=APP) +endif +ifneq ($(wildcard $(APPS_DIR)/$in),) + $(error Error: Application $in already exists) +endif + $(eval p := $(in)) + $(verbose) mkdir -p $(APPS_DIR)/$p/src/ + $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile) +ifdef LEGACY + $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src) +endif + +new: +ifeq ($(wildcard src/)$(in),) + $(error Error: src/ directory does not exist) +endif +ifndef t + $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP]) +endif +ifndef tpl_$(t) + $(error Unknown template) +endif +ifndef n + $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP]) +endif +ifdef in + $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in= +else + $(call render_template,tpl_$(t),src/$(n).erl) +endif + +list-templates: + $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES)))) + +# Copyright (c) 2014-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: clean-c_src distclean-c_src-env + +# Configuration. + +C_SRC_DIR ?= $(CURDIR)/c_src +C_SRC_ENV ?= $(C_SRC_DIR)/env.mk +C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT) +C_SRC_TYPE ?= shared + +# System type and C compiler/flags. + +ifeq ($(PLATFORM),msys2) + C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe + C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll +else + C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= + C_SRC_OUTPUT_SHARED_EXTENSION ?= .so +endif + +ifeq ($(C_SRC_TYPE),shared) + C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION) +else + C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION) +endif + +ifeq ($(PLATFORM),msys2) +# We hardcode the compiler used on MSYS2. The default CC=cc does +# not produce working code. The "gcc" MSYS2 package also doesn't. + CC = /mingw64/bin/gcc + export CC + CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes + CXXFLAGS ?= -O3 -finline-functions -Wall +else ifeq ($(PLATFORM),darwin) + CC ?= cc + CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes + CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall + LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress +else ifeq ($(PLATFORM),freebsd) + CC ?= cc + CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes + CXXFLAGS ?= -O3 -finline-functions -Wall +else ifeq ($(PLATFORM),linux) + CC ?= gcc + CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes + CXXFLAGS ?= -O3 -finline-functions -Wall +endif + +ifneq ($(PLATFORM),msys2) + CFLAGS += -fPIC + CXXFLAGS += -fPIC +endif + +CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)" +CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)" + +LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei + +# Verbosity. + +c_verbose_0 = @echo " C " $(?F); +c_verbose = $(c_verbose_$(V)) + +cpp_verbose_0 = @echo " CPP " $(?F); +cpp_verbose = $(cpp_verbose_$(V)) + +link_verbose_0 = @echo " LD " $(@F); +link_verbose = $(link_verbose_$(V)) + +# Targets. + +ifeq ($(wildcard $(C_SRC_DIR)),) +else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),) +app:: app-c_src + +test-build:: app-c_src + +app-c_src: + $(MAKE) -C $(C_SRC_DIR) + +clean:: + $(MAKE) -C $(C_SRC_DIR) clean + +else + +ifeq ($(SOURCES),) +SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat)))) +endif +OBJECTS = $(addsuffix .o, $(basename $(SOURCES))) + +COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c +COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c + +app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE) + +test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE) + +$(C_SRC_OUTPUT_FILE): $(OBJECTS) + $(verbose) mkdir -p priv/ + $(link_verbose) $(CC) $(OBJECTS) \ + $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \ + -o $(C_SRC_OUTPUT_FILE) + +%.o: %.c + $(COMPILE_C) $(OUTPUT_OPTION) $< + +%.o: %.cc + $(COMPILE_CPP) $(OUTPUT_OPTION) $< + +%.o: %.C + $(COMPILE_CPP) $(OUTPUT_OPTION) $< + +%.o: %.cpp + $(COMPILE_CPP) $(OUTPUT_OPTION) $< + +clean:: clean-c_src + +clean-c_src: + $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS) + +endif + +ifneq ($(wildcard $(C_SRC_DIR)),) +$(C_SRC_ENV): + $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \ + io_lib:format( \ + \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \ + \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \ + \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \ + [code:root_dir(), erlang:system_info(version), \ + code:lib_dir(erl_interface, include), \ + code:lib_dir(erl_interface, lib)])), \ + halt()." + +distclean:: distclean-c_src-env + +distclean-c_src-env: + $(gen_verbose) rm -f $(C_SRC_ENV) + +-include $(C_SRC_ENV) +endif + +# Templates. + +define bs_c_nif +#include "erl_nif.h" + +static int loads = 0; + +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + /* Initialize private data. */ + *priv_data = NULL; + + loads++; + + return 0; +} + +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +{ + /* Convert the private data to the new version. */ + *priv_data = *old_priv_data; + + loads++; + + return 0; +} + +static void unload(ErlNifEnv* env, void* priv_data) +{ + if (loads == 1) { + /* Destroy the private data. */ + } + + loads--; +} + +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + if (enif_is_atom(env, argv[0])) { + return enif_make_tuple2(env, + enif_make_atom(env, "hello"), + argv[0]); + } + + return enif_make_tuple2(env, + enif_make_atom(env, "error"), + enif_make_atom(env, "badarg")); +} + +static ErlNifFunc nif_funcs[] = { + {"hello", 1, hello} +}; + +ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload) +endef + +define bs_erl_nif +-module($n). + +-export([hello/1]). + +-on_load(on_load/0). +on_load() -> + PrivDir = case code:priv_dir(?MODULE) of + {error, _} -> + AppPath = filename:dirname(filename:dirname(code:which(?MODULE))), + filename:join(AppPath, "priv"); + Path -> + Path + end, + erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0). + +hello(_) -> + erlang:nif_error({not_loaded, ?MODULE}). +endef + +new-nif: +ifneq ($(wildcard $(C_SRC_DIR)/$n.c),) + $(error Error: $(C_SRC_DIR)/$n.c already exists) +endif +ifneq ($(wildcard src/$n.erl),) + $(error Error: src/$n.erl already exists) +endif +ifdef in + $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in= +else + $(verbose) mkdir -p $(C_SRC_DIR) src/ + $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c) + $(call render_template,bs_erl_nif,src/$n.erl) +endif + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: ci ci-setup distclean-kerl + +KERL ?= $(CURDIR)/kerl +export KERL + +KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl + +OTP_GIT ?= https://github.com/erlang/otp + +CI_INSTALL_DIR ?= $(HOME)/erlang +CI_OTP ?= + +ifeq ($(strip $(CI_OTP)),) +ci:: +else +ci:: $(addprefix ci-,$(CI_OTP)) + +ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP)) + +ci-setup:: + +ci_verbose_0 = @echo " CI " $(1); +ci_verbose = $(ci_verbose_$(V)) + +define ci_target +ci-$(1): $(CI_INSTALL_DIR)/$(1) + $(ci_verbose) \ + PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \ + CI_OTP_RELEASE="$(1)" \ + CT_OPTS="-label $(1)" \ + $(MAKE) clean ci-setup tests +endef + +$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp)))) + +define ci_otp_target +ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),) +$(CI_INSTALL_DIR)/$(1): $(KERL) + $(KERL) build git $(OTP_GIT) $(1) $(1) + $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1) +endif +endef + +$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp)))) + +$(KERL): + $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL)) + $(verbose) chmod +x $(KERL) + +help:: + $(verbose) printf "%s\n" "" \ + "Continuous Integration targets:" \ + " ci Run '$(MAKE) tests' on all configured Erlang versions." \ + "" \ + "The CI_OTP variable must be defined with the Erlang versions" \ + "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3" + +distclean:: distclean-kerl + +distclean-kerl: + $(gen_verbose) rm -rf $(KERL) +endif + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: ct apps-ct distclean-ct + +# Configuration. + +CT_OPTS ?= +ifneq ($(wildcard $(TEST_DIR)),) + CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl)))) +else + CT_SUITES ?= +endif + +# Core targets. + +tests:: ct + +distclean:: distclean-ct + +help:: + $(verbose) printf "%s\n" "" \ + "Common_test targets:" \ + " ct Run all the common_test suites for this project" \ + "" \ + "All your common_test suites have their associated targets." \ + "A suite named http_SUITE can be ran using the ct-http target." + +# Plugin-specific targets. + +CT_RUN = ct_run \ + -no_auto_compile \ + -noinput \ + -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \ + -dir $(TEST_DIR) \ + -logdir $(CURDIR)/logs + +ifeq ($(CT_SUITES),) +ct: $(if $(IS_APP),,apps-ct) +else +ct: test-build $(if $(IS_APP),,apps-ct) + $(verbose) mkdir -p $(CURDIR)/logs/ + $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS) +endif + +ifneq ($(ALL_APPS_DIRS),) +define ct_app_target +apps-ct-$1: + $(MAKE) -C $1 ct IS_APP=1 +endef + +$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app)))) + +apps-ct: $(addprefix apps-ct-,$(ALL_APPS_DIRS)) +endif + +ifndef t +CT_EXTRA = +else +ifeq (,$(findstring :,$t)) +CT_EXTRA = -group $t +else +t_words = $(subst :, ,$t) +CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words)) +endif +endif + +define ct_suite_target +ct-$(1): test-build + $(verbose) mkdir -p $(CURDIR)/logs/ + $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS) +endef + +$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test)))) + +distclean-ct: + $(gen_verbose) rm -rf $(CURDIR)/logs/ + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: plt distclean-plt dialyze + +# Configuration. + +DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt +export DIALYZER_PLT + +PLT_APPS ?= +DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS) +DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs + +# Core targets. + +check:: dialyze + +distclean:: distclean-plt + +help:: + $(verbose) printf "%s\n" "" \ + "Dialyzer targets:" \ + " plt Build a PLT file for this project" \ + " dialyze Analyze the project using Dialyzer" + +# Plugin-specific targets. + +define filter_opts.erl + Opts = binary:split(<<"$1">>, <<"-">>, [global]), + Filtered = lists:reverse(lists:foldl(fun + (O = <<"pa ", _/bits>>, Acc) -> [O|Acc]; + (O = <<"D ", _/bits>>, Acc) -> [O|Acc]; + (O = <<"I ", _/bits>>, Acc) -> [O|Acc]; + (_, Acc) -> Acc + end, [], Opts)), + io:format("~s~n", [[["-", O] || O <- Filtered]]), + halt(). +endef + +$(DIALYZER_PLT): deps app + $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS) + +plt: $(DIALYZER_PLT) + +distclean-plt: + $(gen_verbose) rm -f $(DIALYZER_PLT) + +ifneq ($(wildcard $(DIALYZER_PLT)),) +dialyze: +else +dialyze: $(DIALYZER_PLT) +endif + $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS) + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: distclean-edoc edoc + +# Configuration. + +EDOC_OPTS ?= + +# Core targets. + +ifneq ($(wildcard doc/overview.edoc),) +docs:: edoc +endif + +distclean:: distclean-edoc + +# Plugin-specific targets. + +edoc: distclean-edoc doc-deps + $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().' + +distclean-edoc: + $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info + +# Copyright (c) 2014 Dave Cottlehuber +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: distclean-escript escript + +# Configuration. + +ESCRIPT_NAME ?= $(PROJECT) +ESCRIPT_COMMENT ?= This is an -*- erlang -*- file + +ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*" +ESCRIPT_SYS_CONFIG ?= "rel/sys.config" +ESCRIPT_EMU_ARGS ?= -pa . \ + -sasl errlog_type error \ + -escript main $(ESCRIPT_NAME) +ESCRIPT_SHEBANG ?= /usr/bin/env escript +ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**" + +# Core targets. + +distclean:: distclean-escript + +help:: + $(verbose) printf "%s\n" "" \ + "Escript targets:" \ + " escript Build an executable escript archive" \ + +# Plugin-specific targets. + +# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl +# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center +# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE : +# Software may only be used for the great good and the true happiness of all +# sentient beings. + +define ESCRIPT_RAW +'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\ +'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\ +' [F || F <- A, not filelib:is_dir(F) ] end,'\ +'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\ +'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\ +'Ez = fun(Escript) ->'\ +' Static = Files([$(ESCRIPT_STATIC)]),'\ +' Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\ +' Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\ +' escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\ +' {archive, Archive, [memory]},'\ +' {shebang, "$(ESCRIPT_SHEBANG)"},'\ +' {comment, "$(ESCRIPT_COMMENT)"},'\ +' {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\ +' ]),'\ +' file:change_mode(Escript, 8#755)'\ +'end,'\ +'Ez("$(ESCRIPT_NAME)"),'\ +'halt().' +endef + +ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW)) + +escript:: distclean-escript deps app + $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND) + +distclean-escript: + $(gen_verbose) rm -f $(ESCRIPT_NAME) + +# Copyright (c) 2014, Enrique Fernandez +# Copyright (c) 2015, Loïc Hoguin +# This file is contributed to erlang.mk and subject to the terms of the ISC License. + +.PHONY: eunit apps-eunit + +# Configuration + +EUNIT_OPTS ?= +EUNIT_ERL_OPTS ?= + +# Core targets. + +tests:: eunit + +help:: + $(verbose) printf "%s\n" "" \ + "EUnit targets:" \ + " eunit Run all the EUnit tests for this project" + +# Plugin-specific targets. + +define eunit.erl + case "$(COVER)" of + "" -> ok; + _ -> + case cover:compile_beam_directory("ebin") of + {error, _} -> halt(1); + _ -> ok + end + end, + case eunit:test($1, [$(EUNIT_OPTS)]) of + ok -> ok; + error -> halt(2) + end, + case "$(COVER)" of + "" -> ok; + _ -> + cover:export("eunit.coverdata") + end, + halt() +endef + +EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin ebin + +ifdef t +ifeq (,$(findstring :,$(t))) +eunit: test-build + $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS)) +else +eunit: test-build + $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS)) +endif +else +EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES))) +EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl))) + +EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \ + $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)') + +eunit: test-build $(if $(IS_APP),,apps-eunit) + $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS)) + +ifneq ($(ALL_APPS_DIRS),) +apps-eunit: + $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done +endif +endif + +# Copyright (c) 2013-2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: relx-rel distclean-relx-rel distclean-relx run + +# Configuration. + +RELX ?= $(CURDIR)/relx +RELX_CONFIG ?= $(CURDIR)/relx.config + +RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx +RELX_OPTS ?= +RELX_OUTPUT_DIR ?= _rel + +ifeq ($(firstword $(RELX_OPTS)),-o) + RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS)) +else + RELX_OPTS += -o $(RELX_OUTPUT_DIR) +endif + +# Core targets. + +ifeq ($(IS_DEP),) +ifneq ($(wildcard $(RELX_CONFIG)),) +rel:: relx-rel +endif +endif + +distclean:: distclean-relx-rel distclean-relx + +# Plugin-specific targets. + +$(RELX): + $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL)) + $(verbose) chmod +x $(RELX) + +relx-rel: $(RELX) rel-deps app + $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS) + +distclean-relx-rel: + $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR) + +distclean-relx: + $(gen_verbose) rm -rf $(RELX) + +# Run target. + +ifeq ($(wildcard $(RELX_CONFIG)),) +run: +else + +define get_relx_release.erl + {ok, Config} = file:consult("$(RELX_CONFIG)"), + {release, {Name, _}, _} = lists:keyfind(release, 1, Config), + io:format("~s", [Name]), + halt(0). +endef + +RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))` + +run: all + $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console + +help:: + $(verbose) printf "%s\n" "" \ + "Relx targets:" \ + " run Compile the project, build the release and run it" + +endif + +# Copyright (c) 2014, M Robert Martin +# Copyright (c) 2015, Loïc Hoguin +# This file is contributed to erlang.mk and subject to the terms of the ISC License. + +.PHONY: shell + +# Configuration. + +SHELL_ERL ?= erl +SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin +SHELL_OPTS ?= + +ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS)) + +# Core targets + +help:: + $(verbose) printf "%s\n" "" \ + "Shell targets:" \ + " shell Run an erlang shell with SHELL_OPTS or reasonable default" + +# Plugin-specific targets. + +$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep)))) + +build-shell-deps: $(ALL_SHELL_DEPS_DIRS) + $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done + +shell: build-shell-deps + $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS) + +# Copyright (c) 2015, Loïc Hoguin +# This file is part of erlang.mk and subject to the terms of the ISC License. + +ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq) +.PHONY: triq + +# Targets. + +tests:: triq + +define triq_check.erl + code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]), + try + case $(1) of + all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]); + module -> triq:check($(2)); + function -> triq:check($(2)) + end + of + true -> halt(0); + _ -> halt(1) + catch error:undef -> + io:format("Undefined property or module~n"), + halt(0) + end. +endef + +ifdef t +ifeq (,$(findstring :,$(t))) +triq: test-build + $(verbose) $(call erlang,$(call triq_check.erl,module,$(t))) +else +triq: test-build + $(verbose) echo Testing $(t)/0 + $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)())) +endif +else +triq: test-build + $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam)))))) + $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES))) +endif +endif + +# Copyright (c) 2015, Erlang Solutions Ltd. +# This file is part of erlang.mk and subject to the terms of the ISC License. + +.PHONY: xref distclean-xref + +# Configuration. + +ifeq ($(XREF_CONFIG),) + XREF_ARGS := +else + XREF_ARGS := -c $(XREF_CONFIG) +endif + +XREFR ?= $(CURDIR)/xrefr +export XREFR + +XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr + +# Core targets. + +help:: + $(verbose) printf "%s\n" "" \ + "Xref targets:" \ + " xref Run Xrefr using $XREF_CONFIG as config file if defined" + +distclean:: distclean-xref + +# Plugin-specific targets. + +$(XREFR): + $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL)) + $(verbose) chmod +x $(XREFR) + +xref: deps app $(XREFR) + $(gen_verbose) $(XREFR) $(XREFR_ARGS) + +distclean-xref: + $(gen_verbose) rm -rf $(XREFR) + +# Copyright 2015, Viktor Söderqvist +# This file is part of erlang.mk and subject to the terms of the ISC License. + +COVER_REPORT_DIR = cover + +# Hook in coverage to ct + +ifdef COVER +ifdef CT_RUN +# All modules in 'ebin' +COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam))) + +test-build:: $(TEST_DIR)/ct.cover.spec + +$(TEST_DIR)/ct.cover.spec: + $(verbose) echo Cover mods: $(COVER_MODS) + $(gen_verbose) printf "%s\n" \ + '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \ + '{export,"$(CURDIR)/ct.coverdata"}.' > $@ + +CT_RUN += -cover $(TEST_DIR)/ct.cover.spec +endif +endif + +# Core targets + +ifdef COVER +ifneq ($(COVER_REPORT_DIR),) +tests:: + $(verbose) $(MAKE) --no-print-directory cover-report +endif +endif + +clean:: coverdata-clean + +ifneq ($(COVER_REPORT_DIR),) +distclean:: cover-report-clean +endif + +help:: + $(verbose) printf "%s\n" "" \ + "Cover targets:" \ + " cover-report Generate a HTML coverage report from previously collected" \ + " cover data." \ + " all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \ + "" \ + "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \ + "target tests additionally generates a HTML coverage report from the combined" \ + "coverdata files from each of these testing tools. HTML reports can be disabled" \ + "by setting COVER_REPORT_DIR to empty." + +# Plugin specific targets + +COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata)) + +.PHONY: coverdata-clean +coverdata-clean: + $(gen_verbose) rm -f *.coverdata ct.cover.spec + +# Merge all coverdata files into one. +all.coverdata: $(COVERDATA) + $(gen_verbose) $(ERL) -eval ' \ + $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \ + cover:export("$@"), halt(0).' + +# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to +# empty if you want the coverdata files but not the HTML report. +ifneq ($(COVER_REPORT_DIR),) + +.PHONY: cover-report-clean cover-report + +cover-report-clean: + $(gen_verbose) rm -rf $(COVER_REPORT_DIR) + +ifeq ($(COVERDATA),) +cover-report: +else + +# Modules which include eunit.hrl always contain one line without coverage +# because eunit defines test/0 which is never called. We compensate for this. +EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \ + grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \ + | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq)) + +define cover_report.erl + $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) + Ms = cover:imported_modules(), + [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M) + ++ ".COVER.html", [html]) || M <- Ms], + Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms], + EunitHrlMods = [$(EUNIT_HRL_MODS)], + Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of + true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report], + TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]), + TotalN = lists:sum([N || {_, {_, N}} <- Report1]), + TotalPerc = round(100 * TotalY / (TotalY + TotalN)), + {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]), + io:format(F, "~n" + "~n" + "Coverage report~n" + "~n", []), + io:format(F, "

Coverage

~n

Total: ~p%

~n", [TotalPerc]), + io:format(F, "~n", []), + [io:format(F, "" + "~n", + [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1], + How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))", + Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")", + io:format(F, "
ModuleCoverage
~p~p%
~n" + "

Generated using ~s and erlang.mk on ~s.

~n" + "", [How, Date]), + halt(). +endef + +cover-report: + $(gen_verbose) mkdir -p $(COVER_REPORT_DIR) + $(gen_verbose) $(call erlang,$(cover_report.erl)) + +endif +endif # ifneq ($(COVER_REPORT_DIR),) diff --git a/rebar b/rebar deleted file mode 100755 index 8d6029d269c30f51de41377e9ff8382a6e73cae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202329 zcmZ^~W6Ur-6ealBwr$%s-p96W+qP}nwr$(Ct^Hq=naWaMaJ?+iss`kxUJ(ApaiIGPw5IMV;G+T=eRl)N-B2nxXeC>BP7 z;{UVre^y}swf_tF|Br$GzcK&A8U6nSg!rG%WPAe1|9}7h*x>;H{>K#m&#eDz0dxlT z_9<%8a>R@DtF5-KGsQNvI-1>sYXJvSCD?7?Cg!%9R&OpzIW|KGs z>w9Ozu|`=J$uzyR5_Oz3km`~vm!|J62$4aL(2!Q~(vCh!f3M9hQGj*9|E?#TrS@GU zySsYGZb^U7zi;$|{qz2{E@Mz)ya-isHq0w>=f!`~f{#@*1ic^1CDKpS1-vmsOibw2 zoQ!CJB;9P1&c99Jr>SWm%^{Gqb9VgId)(gy!`i5fVU>Cjljvg@W$uSKmvdqKJ6m1} zccD9nC@g^!BlriTQm$AfTg{LI`mYI0>nY1)n6SSPQ70wKZ=Er~D%89hr>h8J!=8Rj zURbQ)G9Tnn89in-kg%(PIuWY_2z2wxmj<$#opPyi(!V^W)pxkN;Q`@He{Z0NRk z-SIZRNYE2$4|jvLLhgobGBd|oR<~SbVHEJit(bw<$l_SMm?kGF|M4+hdWCG2Q~D5F ze?L2XhRUswR|#|3`?b6%i)zP`v`PA25tHs9zL;Kcfm|NwELB;U4+s2?4r~@vzYw_^ zZy;g3$N{u40T3;lBZ$^zBgAvh zO>92A)!J^G%+gevl-$D~I7sv~9|RXXX;E!5fUwz&o^vGV)i76Y5liB-Pu9pr5HGDF zc&3V6CcYFZ^AW+o5az0>0~r@M+0nKW936)29(ygo+hAHMyj@z--~WDK$fYuvQSku) z@~Hp-Q2)OUjG>8vO|Uw&x{_M!>;Z`}GKc4W{vkKku($}Y2wtQo0HX?`ym!8;FcKUg zMq)Y$N}jrwX!VN?uPSwoQH>JrjdzV~U5(GxzcLpbI~T4S=jP^BKHN=R&n>RYpSKCY zrQHsvpWd9FxlOCOpE|#qp4ZU{6J}qwlDdxzPGCY^n0p?pU&lP2H>eP$Qn-bu7R7T}0C$*j{&Wg8i3v9D}&M zvX@WXmC$jnG=2&TD^fcFwWIq`65U76Y~2Ywh)*jX-MG1&`I6JBhxVgw#r59k*p>tR zpyim&hAMlY0Qa~#WK~w9?*erS>0U7)ZU#+yi>q(Eyj))oUfCe>;E-FeI^y!G)NI(> z_HfL)y_v<+q}0($FCeJ+ut7qTH?gob!APrn6=_zyJY^dQ!PD2z9JsnvTl_ocU=q}z z0sQ#D$f1Jvd7b?gJT;D5#^a_goLWsvLMW$DU8s)0TmcTg#SKc!o*_&{&(01j3swcT z@>h@-#7L6DSHYk!x@2|Aa~FSZs4cwLE!^_g?qy29Pl%lY+hy^vHEc-X@Oiniy*pN#)MEdg7=R^#POLyexuRm>*ADab9KzVg zxc1E+#iHXCT8n!L12{HZ*j;;(QoH0pSwD$I%7Rr-+yVxpShaW&6!Xz?E@gHQb(+EQ zVUvdCb$Jd5J)@!Dkwp6C9_rc3N*T;5-hw}2Vm1U3`_vIGT!>t+d-@k4SlKT{ z{z6YT!GH3LA@;?C7Jq$oGF|VUelEb4K%`CFqF67yJU@E^_&Eu;E+ur0`EA8+br$y> zD4{yK;=&SG@xOIMEL_aEo);Mxf393ddvaQfUd2`7V2NG`ii;~vTwK&U3PJj%bdwl1 z1HpKLutn-4!IsEH&P1)hBUI3;CdF5{d|_>rBranM{RJAK-SA6?84~P&8FyGRh_anx zN$n6V*=r)d6Xtzl(njtXagtcm%%dQ=dHJ}+*e&0Lqf81`3F{8k%hJ;{blEfEhD6j_ z5OoI`k0iSKmF~oP)1wfDGDDMvyW>kAjwXBrY9k~z>`XI|VnyR*QIgdZ<|qES?2(#+ z|4d!P=!V9vQ?d$1m~A?8tO2Rh9l1k*2&*W1n60!`&FU)KH_wiE(hjle7|9*Eqo5+G zv`=RvIVjtfRQ922nB77TyE}5OpjK}<%x||5(d%9Da6U>YOS2Y;G80c~G-21arXj5f zTc!V{ZZ-3?fyf^tV?-ls)O5u0_ke}&gx&WRr&L#YLZ11%%ptlPC zyC>3UPBGHaJ|00SI$3hs`>&iIHRu4N+J? zull^Em5G=tQjM8^))spP#$*iegH^uP%xFwd9U#8IfY2${^AMcD+!#8b&X|imj6h7* zpD)?MAYtbbLKuW{Xki*Zu`!ZylC@7+^G@WQjwiu z+fUZT+Fh7x1uWZS&KTx5$HfDf!yX;?^Avj16=mOauo4@U`*Vx$69 z)DUU$G?2h{PAa&@K|P^{p1g-Q(&o|w4sPd{PN3*Ao;}$IG>HlH-zG%qLid8Abs>uG zNawbq^)y1%zefRCKKIFd9%`I%W17Mx^0+CHTeCghUNYu1S`4zoHRCIcITJ<_WTV!2 zLJcO&FjSwXcAV<*j<&(U6Nn=aI&g2f+K@h1ykdWYSAzL2d#{v)}vh@0xkVkp*!>Gt8!}UWNHfT%d zJ(O%E?AKhNbzl=F)UV@(ugHH&bTmx5EDg_!#K`rGCI*H7r2KFBhLK9#3K`I5!bNCM zSW1Ng(9bDZ7Oa(-Jh&={wVBx=M+i~LouFXSfcPS(lFJVj(I}B3BSEQ7(<{s|qzaX(3YANRO;klpJd-D_D-9`F1;xpnn$c`SA&BY;fN7E&4ABtgMhNk( zPodUfj=$XDJk22clFqmzbRoF zCX5N;f+QW_@YF;m4~V2{Q@Y|p?0MK@2;U}#V+#ScUsbqrVHO(WleS%>5?qpncyR| zrR)TTyahWzNeQqs$5H|c8_$Py$xx_Bhr~RWysv>*GRHY7hKMF*JN|9gyYow3MT2x3 z_QN4X=SFTqa5hnLHl=jgn{ulS#Ah%pqYq?_#6!V+4UAWJfohTELL6=|2q4ZSNa9}8 z2bTm6csaUInbg&cU!FP}n$%!1F8kF)eF~`}oIi@^I zSuhr&CHubGIX-3U8^fW z(KbJY6n7v=WHnMs48jN<5qGT{Q6qlrxH}${p=C|QV1lZ_X@}?oWqQ!4QL?>Ry*llo zE*$b%tqoh?!J{^Y08au_q0}@y8CkK47NtODWxr|hNeN>|Ji8$ABtBT*sn955^v4PMaix)XHe z$B8}Ydoj6`XAMwv@to6tI4H2uKTV-;J8+W@gknIAp5KpU+=$qZCcM1<;%z7D_$7#m zi`g;rY$y|(+$6)mH95$-5NxA}<_MGun9F272$WeqW%9`IS`Pk0 zUAPOMWnkSLq9qekQ`+J{dR=2UKG_BTZd$EglCD{^Xnjx3Gj)t;AJ?r(oJ7lj>u=}; zRF~eGu<$I_2Jow@4Tkv~o1d2eDW3%@-YRN(9tHTt18}!CY0OO%qJI&feM<;3l$BgH zn1+j}r)dle5S+ku?LZ>W*m!qUrv+WAygO0yB-DtL$UCW*E;6bFmxyX_ zYe)Bn5p{;diyAK``?Uj}`?wzk_L82GL|N|RJ}@{arM{k*Uoh7IGwg#d5EJozBg$m4 z-{kMiUSr#QB*`YCdd>@_5S!tJV`)Tm*J(|0TOh9IW5W+es@Vg-9}?%Y>VMs;{=F~} zPkx^pR*bpJQ_)RsvOU^idP~`zVod_>`f6Cl!|W!3cr0{}0b(?>E!fK2sDWqvRmjHe zUI!90viu9N|D)iK9|!Qe!rTAc;zuw!T9+>Zh(Gw-><86v?x%hWu<5dYaiM)Xu2ahG zE8G0I2e`n4-{2Ug5wK!TH8`O0%&%6u3_d^hjW^_A&eg2W0wxnDHg7l&WByQyb8XI{ zBKsFdh6szs$~*5_$<;Hjxa?rp%y-$2uj!|fSBslJ*){r{hiD_8?2}X}w^k~40Uv<{ zui_Fay1`f!qdbNp*I6m&gHtkjvH8!%1}#%%1v4nM$Z%YADoT@EHN~uoOPLMNCeTtT z8cV4bO67;BS<+n7g-0XB&7n}mC$Dny!d-LOT^=l*v`NJplAHDIkh)-{+{kjQ=2HHv(@>o|Y?F?LelekL%*a}rD94p!7Qql@hs~kPi z{@Vp3{Ic7<5%iUajP3oa&8Sh^7_PO_+9d`Luh>GZTHjlRHJ6DjTN?3LE#H?5~5(-oYaZq+5DJ2tsIShLTZAEGpeR~rXrNtY=(e(%d= zfVaovrr2rbB>XM6Tb+;h9Q<7m784nQi=z_j$x1mRjj#EjfRq`$(-hz%decXIHPc>kNMgZ9=kJRf?9SM;-}=IzO=<35hL6FoJa6$+y}kI21ZTsWTBez|E$y17 zC;HU5tc8tvHjCjkcs!2??uLpj1;132A?Ug5jt$1SkD8anYHpu%^AEDI1vA}m&C8oy zEbLFElVkuR-h0^*mN%@~&d-0dv3S$b-vB_77zO; zL)7>ktqY74FL9}_fA5A&ns0sx8C=IesGyj2T>*PvKy@T34>{Q+Uk6*PyMlTyFMNKYhT-P=$g75 z{G^0+dNMk5735B4Q?x>3C!~9}p8D-ROLF|OQkY%CPgjRiL~hqxec^M*V=GQaw&$^R zcXq!7zN$JpV*|~0#j!!8S#Ey5x9tG-XG$Xo5O zd#{Hs&CptT|2~~~y~6T5j5I@M3jc~PT6ceEQnF~bX8XRB90o@Y;9oS}*2lMxwaBmK za!$#wVaZi{nJrze2mO3k9#1~r-7@j!;->h0z7P7~YEkgG94G5rKaRbwZJ3-4Y+tuF z8~b!v$IibYk=e4XpIx%%-|Xm5U4~C-bbPEfx8BOE)1OxSYC2fz_4boiKakU=cNP=7 z$vCs0tm|vLv*tDu5V_w@q?g2UAn-9Cx+d6f{;cb4dm8h72OrJmLgCE$+?Sl9HHt5q z_E3n~b6dX)j^yU7eLO@a0&|kYO=}`Lp3L@S7F`u_dhWmNYJchO4!=g0mDX0y~S-ZUS`Fqvf4G|@w%0b z!EaLACBt&R?FxEjw%@Mm@l8&mQw^EL{(U$pUFii`)ZK0L+FHhK?;OfJd91~ynEiqS z0Q~)_Btmm2d*F}7b^Qgmq<9gkel(5JuAw?w#flj*IXhXT55RqY`)2eYEk>|)v`(Y{sOyehzbf<4HJOg~xkenh$^N^%Ph=_>T)4iS zSNy_H30Wbl?d1r{88{LC7LKa=&Ch1J>yBxYr4vCR)Lp!ZC1Ay`^-ItqTahs z@=NYoOM#(#bc)u5=3h^KD^d`nY%MB5WRml^M13i)&S;Q9wTu4BY5~Wmr*hLsY~GGHdJ`9g}wz(9il13 zt92eV-p{xgM62zJTzlQvwLO71@$z}~rl^#3QaU}AO}e2nd8mYhnqismY716o$4+d*a_bCRJY6;ax~+8+Xg@3XH@%uC==Bom2sw}jT&$E zgS;B@>BC#bJ+go^SK+-QgP#8V#OY^sKAbw|<~7@#EoC7^yxmQQ%(}NQ+D~f%9z$-e zz-9YpW}0>Jq7!5IVCQYQZl&b26q_Bmw>Y+XmZ<>W+g@dOsj`f==PV#2UFJIQr6e17 z;_Q9_KGlRjf%Z#B&gWHSz4Ozm^7}aTSo-FWO!IO%5t&kT5Hb}V5nLDuFjVQg zV&}OOZS?htqQ*?u5nHu;`wWu^rIjT`vGqLqMtERA&^2Uvu-$ZTS~1fw0d7yD$xRW9VxYkl=Gp z`m&{I)fiTL(0ErWhHa9~nC|+bTH!ZE8I#)RCrBxywWK6LPQTpcQ!*2+{$X(U8aitB z>BkLaqBaiQ^|hyK#-^psf&<6Tbg9T+?>B2i!&kt{aX;K}5U*I4iFH+76fz0vcpTEd zrNaaqhxhCZzNc8en12*?&zc$othZ-b8iLG(LVjhZ1^o`2Q)leLfAT(q22o^`-KbJY zYO7XqF-_{R=iFW!@07)5Xr%F(nnV6?H&9Ltdi`cJv-6`}4?D5dde&`+-SH8OJO2#e zB+SPS4XfIbts4!=MR-V4XrTh~0PddrE;Dd@ z(5-I`?6@b|Iff*e_W7D7C*!C4`XN1%V0fGWDlj~R7@{yDA&@ZC0hbu^!%Rg#dlX@; zJurb{GTD$M{8=>GU7;6(Shkp6KO5l!C>lcnmk&&>IEk@P#PcWzk*G(3`=7Gk5of7H z6C*}pW&#Ea3}m!COyxNI=so&{01UsvsNAsFk1$3rQC{=`<>L+m1kp{n0r_Gn23a8w z$_1<+dT7A8wI_y_s3-O)+5+Y>ga7#0&B+7Dx(dIE(WPO*A&Ur6=+vjgtM52I=|tj-eV%RN5(h>9&zHx4ui2pI8V+{#4(6{5iwDDc6*G! zvoTBD=zcI^;?z^5F9DFiZdP@bu*NCqJPEzF8f>vp+T^3?Ly) zZY$<4lHKQ?4AO{FGo`KN%=e-IOwP~<7lbeg%>x;BEJ+-qAbiRwU+T0IRV-C#f#A+d z3A(K@3wbzRs5w@cnAm*G5QlRnV;G*q35FA=;2#A~4)W|a_V|enOjh_y$P6{Y$DU`T zgNIRnRsd{0=xaYDN05&{fJ8rX{D9y-C`CW^JAmFkJP;r*NDx9lfPp`3I|0^kATj|S zNuUw|W^n*aJmfn8_;CP`JVc}bBL!fZ0A@Q3l>liwSfwB;LZItCfODY1Jw|lEUO!4Y zn3FypjlXC;$Zin)KJ#)=S3ci28kQgrOUUUwkmkT$KCQF=>pUixAbUIfZCGwRjL*Ko zIrI+!DqaX70}7J?im@WNv^318#0e1_Sh?0p4^NkUL=NfaE)l>;UIGQi`BM zInXC-WpL$xDNeR!Ko=p%a_q~1&Z69NgJtxR!T@swDe(+*j7g!QdE$KR=RiIN09$`7 zdFaal+IbLPf#W~BV~9t)|D8vtYtJ>v|4+WM4*>u`^8dl3>lql@ni}aD+1c1zSerP~ z{SR8*N7cs~`3%$VZs@g#EHr9P5(4rh9C;86Deq{$AhkaWWK0^8P{7|7*~NN~vtzxN z+3n2R89Orn<{V$kg0*v3tV(%jQ_@5!xV#m$HRM)HYXxO7#?QRMyu`u?%V;x{>gK59 zDMe+8MVf!_>A@@S%_H}Xvkz~(i$4~@t%ZN1t!!>l8bU#iIJlE2G;s#w;-Bi&*&=6; zvT9T$;ysA$s*{EAT1|e1T6A`zs%eeCZo^`uC5UvVHf1MSpCJnKCdkeLp>mN4bEzXc zhLJLh>dGS*cLmB+bLH1lr^2NAz-6xI29s6glw)VA8hJY8$YYSo3ad8Tv!enlEpiYe zZw{quvVZk4b4uZeT3VIqe~G2iLJhvP{!?d-hnats9g?N&t6D`DSj7;8$~HvDCCW9a zEzyyOQ)ZE+gC_%(CQ?vm#UL$pMswRk6xO;czZx`fdJotQ+=>qyjmV(F@j#PPnPWVL7x%|Fq+mzE0RQ%oeA zMseJsC`i{2{^1ZqvIIzy@wtGDSftm0LeRkz2|Cd_r<30lq#IAp@7WRwu{G0IxLP4- ziHD$xNSI&C;S`ERuRyrHGfGFnv58xOJsd=m${V_cLj&~^Gi%{Qi0Trfx~3m?NUHWs z5e%)iW#L!;M$@#mk`)pw2lv!G11)w4hh>2KnohV!mX$!|pnN`tT6yJiO zhnF@WIvYT#U`VFcEQ9ol+nbdMW$j|*c58HW3fo*+TJW)S=LSi7P%BIf{@^r5)0pE0 ziW?qu07Cu%{=oA9*V7edPTp0#UCdK00OZjC;qH%`0>u80tJP2M*Z_s(>;Rg)9?bj5 z0BH8~`9ogf*)2KvQAgv>j;k|GV@Gxm-!Zw--Ro7|>(y`0jOq)c-EXrROD88=!F-$d z72LQ(m7q9OpwGkC8E3CAw?7TTYP#yZ-A{}0!CI6FB! z@4FLg_}2fWl{`1m{CN9#>xdcDr~Ehn&MrFnKueoRlWe`|NzOTNF)StC(vmcFic z*DFz5^gRy81NeNehu>MWL3#W?Su-bVy^AkUYVCo&)J}ixeIeV?xmpvpe+&)|-me+r zZ9aEBS8>;Tg?T;4dTYK0$G=H$|0>Mjf6B@I-bWiQM*07g{1)G4Ni;wHdTD zoyGR>cO8tU^}R1@Ii1tZHjnUs$Duna;;nakKkez~z2jy1}qi zpJnI51AqUmJekV5nwIZ!2eSHe-FatcKzo^udGL+h-Zjw-Wn>|XjxkA2g=es_sx7!b z59?uVP`6*iWZYGqvF^=oDJcO9YvOq`rpM<@&ujPKWKm$Lz{3Wsj}@o3(p0rpF0pN<$eLG) zl+R5|~KpCk+7>9J6k9-1wbF+RN6`X*_HnI-T4tqZF{Wz5bZ#5>Y4=jDG` zxB5F!$9Qw)W)Sua?5f1t6~>EVLf^X$mY>h;+wKnoeJ) z0JD3>rDL)uhb%!{iX)M2sschg@uf^*O2YIb;cn}*!URZB~ z{nKA)uGTm9R!yUlHfCO`zzp5t3iVupLYt=1Dlr`8NM%L>mC#^#gf0b9ZAz!xj@3($ z%>Zp$q>+^?i&aVMIY+#%jvbM8CdsA4qDh-Oy_Qr_k4tDRQlrCwRubE7(k2?gj2}U{ zp9(6ozFSZvDAZ`(=sav(9OV5O{;kB*8t$yo(yyz;Kn}O*HBdNj5l?;3qCQ>J1OVkD z3}miA`={H+v_UQPO^dDEIH7+;`H!1aYxzvoaeZqY6bQJIMvAAV#T++SujYPP3$`Y# zbZI4!$o2;5N&+77>e59t*=1o&$;02CAQ21U>X=k=t*|mm1Qf;{6lhiH1O?lB}TNKKocDE6(P5_)f~837r5eTs$wl!k=^i8?B7m)l$HBteRk(V?Xnu7 zixK5Z=E<@qNJ1`{4(>AXJdDa43z824Q#C3}gU(_xp=c~5a@@Y1V+8$TgMno0rTiTe2@JkU{lvT}TyF5pA5W^Iz5!o0Gq=XIHN>a3kf zl_*=lzurZM;hknw!?#TeR0WKJjZs!$+c_p%?0qheOSjEy>K05mq#YQLuz(M=C|mGT zDuz8O%cONPcR?7+g!D1|Ct)}HTr(${LNAn+LcliHB5CW;OjiU^tfWa^+(pUhB>>3d zbjvY2IDkV}4{m=|t27LM55O+;R}vYR@tsDD@-<%A!&XuUZn-u<3DEdT*m7-SffO)s zWfL9(Frr*j3r9u#H*Rl`bz$L1EbQo*D?UYN>h;4_Tc9FB9WgSH*W^C!YgdcKT0crL z`#<`WU22y7bl$DI<~x5b2Nf-vO{gBo{#e@@x*lw!vg}ku@@48!_e#!G1a(UftV^V!`Jj78cpyUzHp4Ou)vuLt{VWVTXE@4bd9D(J zFK!^t1f?v|p?*q`jm;`l88uLKx+t-2s28wdIP;ETCk4RQzW*|efjg^UU-+qQLsbIV zIcPRvABYUjhZfrxUSsSpcE=DaoWuv;>H%TqDFIZ{TQCttGQBrKv1GPPAI*|=q zgsXQQt7jEyaE&frJ}n+{qYUxo?mDPd^L}c8@qk~nnxTPQ1d71z^Dc68>Yv%V9hw&d0LU4FI_{(7lKt$|)_oxM^1lg${ii+qBfwjmlP2CM-$F4qAQa9qvtfrvLDo#p4X>IKJg{K^JfI!*Fr=g$XK|;XBwkxmFui7aC?+ zV`E?HT%E6Tu7`(zS2;XWj?Qv&yRx-w7nA`%zCpF?aKB<7YSvD*2`?Vjost&L?068g zPdc6-7r)@?d;cn&-?L)G=Xg)~o%sG1TAb4Icpt)gVEMnU^$-U|+s%CW-^SIhJY)C# ze&2=rGQZEzL(i&qc@TNtiemP>Dy|OxZd33(ekY~HXFY2!?ys@qcz=xM!tlF0YCNyT zukF9D+UTb9II4WOyfb>fp4BvU)4li{_9kkdqvqs#-!3=eWN~l5jON}}{IsET|2Fr8 zV8Q)ii4=-@%^a$ek^$)bYqCjDxM8!*laOzsS3@?n*CWi~iwl^vs{4P<@{nUF zRlsPzFY}zqnjl>mE=o8~vEy!~{c}XxjhWWw33y99;vC8*B@Hv%pC3QJjR+$CDtywG zQHO2`W1(e1TpZ*k&M`sgv9tF!H2#|p@Q9r$hLUP;DPncr^4Q-`KXMM?I=cpn#qdC; zNrcBvuBPIin(teru7@0I$N01)QAsJPZw3kwldqP4tr@7L^CS72EaCY zYjki8-zI?7q_3?`s~~wA6bn|bDw?ge0ux*t_vS3ih5v_*6?CtaIhGis9}b54KPl1^9tt3 zV?>zp=ue@u&|a!-No07>Z*!!D=SU(=xs=MMj}tYCQl{vN(b?%QO$YyBJyYkgJXdGT zFOH&lS)G?Hbr=RPT}}kTy`3WIN|-%cJBpggoh)ulrev#5pF_&bp=%@KG(dnXD-rfv zojPXJnG`occT^(f(ocH&Ncb5F4*2}49PY?g0;QV0}AOi^j(m!>=YwSp(kMm%>kzpY}nrz6cTk1 z1!tcM6vSs`FgQhGadpSrZiXaIW2Ph&n!Gk96|lFQU|d22rje9z4gnirboukN%u(jH zO)^wnB82KZEs~!U(wO4ne(28C4w&JQtvR-+hDPl#Gh?-5bMq_I$3nG;%&Ajv-;>DV zk{)qjvyk4MPn`v7PiI={s9tLjp_a4U=e)Z{k|ngaKTX_SMmm;Tqf(R}xpoYg7s!=0 zjr2TXhm;{{S(>nxT5A_#tivu_LO72!)CE>Ip(?w86wg%Zhy~(~diqpEid^1LEVU>; ziz?OazcL#pjTBSqjHgIAT$wv2j01&>-RZAEXQIuLQMRAxC4H9>yn_U1uITUi;q4jt z-7gI>Tzw!;kwk;`?6Ae)Jc^Ar(1!uPgMb7iaW<2n7x27;xd4{Xt2Y$Y%UHX!P6U!5 zRY%soOUji;_zomyVc}5L^6U<BB>jO;RyiC6Hr89Y*HWzuMAaom{#mg%r9iPrdgo|pdFUaz<`b_=dzaZ z0u9mSqpCDv3YqpmRS^Yrfzj}&W8k$%gw<^poxDt^RamVYt9H`0kQKecqVp>G7WhvN zWs{HZ++>-qt6B9dCLYx3gB*z6(fEx+OJhcT5eK^rIrx#6IQ}Hml?tiTqyXk zU9O0#0w>T+t9_MXJFiUOH!b&*gQil8sD9Z!DZ@%oX`qbjf4%?dqRoL;+RlmI7IOHF zVs=oouNeaiH4KE3>?R0{0^)HG+;d}vfNey1o(*l;EGS_82GyqA2LrR>TiF?*@~$D@ zJw8tnO1NN8;Q>m+;T37|D%IY(+&fjfj22H-KHVO87{GxIzgAv&RvKawJ`6YFR276S zqLHpNS|YCrRmSs*aXqMD^3io>R16TQZz~a3zfF)T3ASqWvKs!?&_ofi; zeLe`VWwCdz1#(H^!t1g~6NDv5^Ky!X)iub^OMN9c6|l$4!EaMU@A5W#^l*7)_+6v} zY$4);g$%%6UuT3=6kHR<1%(0ta8M2ki3K1hK1~F?tK+uZGtZR_dC=riaJv^Bof=a@ zN_oWj3ri?Z`+ul}?4_UUpfBG?m(xyYaDkjJ@sSvid~}O7!EF#u^Op}QC{cQ%hSsVe zRb4y2>;bnM`W*y|H-AP86j4GN`O)S(uRx|(0DIwJ29)!QG|en5-NE^vG~3`ZZtE6Y z&|&$oFUiCDL>to$KcYy0E~z`9^|$g9EW8f0VY8nGGmEb0Rx78Z z2iaJ9zy(1B6%IYok7&EVUpG15Y{M&1NWi3YLQse703B=8H62GHMMuRriYagVp$vNX zjo|$<0I&;y{%rv`7^v-tgW`Q{TJ9K;hV;uSNrQIcUI=|XvL~VL5!k0$yy}mP@;Cjx z@IWAV*F_;@6hJpfwt6^$VU`#awWluGm;1|#*_{Da4fhZ$W$yLc6Kw>x#{PB*;0BT^ zkw__+0$|JUwBg1m-!@qL!125OybYpU4cs68<12%V44}r49N!8W{?WpU;(~5!l8Iyb zdq#5VUjaZBaDqC+-B79LAZ9lgS7is5pkDh_Qo@ZxgGc&@7|)Vc!FI^v!wVU*y*|lN zAs?@p5;yHYd@)1u`-Zd0=0R2oS3AT{xGqTOXKtSMUgUd(P7d(9l>e%ZDyI;}20x82 z5R_NYn*EG6oi#b&GRgBTx++1ug6+WxO1}t^W?paekJdqW&yRy3xRAT|$pD=J$RwHV z!7hY>-L&2b!nr`ec^TxaPlx<7zcrO{T*LI&3h#YbZhYcjRdo+Ude?$bQ?6W)R;3fz zR>0qZ5%S_k{Esa#qzqcXG^Pyzr|`D#vIBc{l)HTh5B$OJLfHbdisTIvAo%^ykA)aI z+7ZXnbQm^G+MWo68~1Vz!fs}R9QuijxmgfS!7ZY}E(o7fCujVDyZQrg@w&mWFr0CK zZ@h@V5gs82A&@l6jYPDx4zr{x2W?*z7laLb;Zb>Ei~x&qz$w3ox;qI?FctzFx=_6Q zlcf}fz8O-OfQG<|vjO~y5Pe|+nhF4YQ6^oKQ@tahP_gT&(MZC+XN@EGZu^W6D7or_ zExP=^9oWbM(IAWCDhZVV)$n-GPK}iHu3P^9)Yn1NWtNfYabK#!C%72OP zkHJyj{3DA}PTFBP<*qT^E&Pw{0+|MV{+3g+#L zU-Ra`G~RR=_IZ6{5^OfRC}MWpa}d+`A`;-d8!8l-eMdqC;{ zP61CrLwB)&S1tCGO`YW`WzrwiI9|xya`Tr|8LYIwJ#Xtd_HLB4^>1ntnPo}ag{>Ut zO4euU^w8EHBXR8?YH9zi+N@tJE~m{R^>u1z8g}YrPTo--+)xh$Z$B|q|03yhX~Vpj zw0-f*f~@*SVFtI91+!l+DzBMG=oOKkDUq__P&OP$Ong{Jz`CVn|6!FFnVHwx_^^yE z)kf>k&9u9@(CL+Y+0;E4x~|6XpLC4<@LfJKT7UTQb7Zht&{_cO`J7gyTnH;I=pKa0 zteo+l^;E?D9sphpHAJxE^Ey2Rs*xS-py%TF`rLfyX-li+KK8g=?a0Z(__;o1T$Q1N z?YX~n`Sq9hzJDgE)n&iazoNQYoLvqkwE58Ee-j@)`sA^tjP1s*!SuNv2c)_9b$2{8 zRVMhoup0jM`}Oj?e2<*rX?uTB-?;UC1=Wi0VS5x4F8`eX@9{q@y0!1qJG_h}#KQCY zhI>7fd5&Gi>E2AX%xG)-90$4SJ*UpO^!PcKuRkxQ?mhiH_Ne{pdfnIM-hAfXYE}Mi z`62ywUr25Jeb35YsnN4E!9O+4(0f169)qu~4mZB}_SQe&t?7C_{jmF59gfhi(*0`e z?UH+%hRJn5FDmi#rat7S_-&)VKet?=-+mbVn(ff@@VJiy z@;+Qet>Jh0UT)#L`aGohWkTq6J-S^yFCESGZv7sG`8{yDeK+-eT-Cq$f6Sk1-O>I$ zktfV48R@aDh3J07y}J1tc0Wz3C3T?8jHTJ`ZC{-p(W&n_UYWhBJvuLzz;|(Eu5nZ& z)5%!fw?}P&U!_amxqM7*WAPp5F6E}%TWqo$+3K`(@+^aGlu-U3be&^&W>K)MW81cE z+iz^!w%xI9+fF)W$L!d4(y^VBd&d28^b__TW35{C)SR;zFExgTXL}JkPkuM>=yETn zb3EtFgyBz(_*yzz`46$dzt{`r7wXEG;RMTLHa$_$G8uHc?>v_aSmS@}lr62l5`G?T zR;m=Eu7S7PG~dz<`?z?$4a)u^FpS;1G%!aA-Jg)2=aKuZY4fMfD=FmtD6AG{y;&Y!21#OzwERg1Z6RBsPaUUirR4_6hN0 zqlb)R&4)gR0>%j-2j3Ksncx3y;;|W&#+vgp)7OLs0wVoiJ60Ea=Knd;$CE_Q-{SW1 z_}goG{e-vSbYbs8LG9$*W)aRtD22blrP21)juMVidgXQPKBNC`|Gc{8k}N2#EN&%D zON3&e1zl-xSs?=6{!0vvoFvLp?Ik#i#%=*(ZZ?W4f<#;d9jY>j^PgLz*sye8Zsv~9 z{qghm)pnO3s=*Wq*%4$o
    `R}|8-UC1oQaH04X^=VxyeaeOPbd91U6r~8ZJ$f^h zfVp~1(iK*ri;~9~<;-fO4ty!h61~^(1PA(go|aQKoOU4ry~05tUVv^qB0%FQ`w#(UgW=(3t>(A zPSgf^ibSeLVcLsx{MKMz9q{N2kDFmlddxI(Y8w^7hG|pYNQ#=xR~Mft)0tn}&Rge8 z-r}RJ{ADEDxaPTMuyUfU!pQqOp%$dYsgsZufmD?5EcvT7&gVR86kGsjsP`%&(jZdS zh{HqwB$aR}d6`7KH3brw0rDg;%tngpoMRi`KT6#5G5s29QVfXxI8Okv=-+Q%!sNiio6JesBe8ejS7_r)LE}XR2dEBX zn@KejgBjtwqYVMJx=Zb}U(^D~sqFS0T1y$0;K`~(256@9s5S!@QdelnL7(Kp(}S^d zfP!K`=nXZ>z->f;_-vUO38JKqlQmachO(ymWRUj8r$skqnV}mJX(?qH)tvixSwvjr zrkrNuDvL`j^@Bj&7mM=5In2a{vujhTuqExY^_#%%{(<=lh z6W~1ML`Dj*M`;DRUS(n>3JXV(PyimCA{{fZFhQWwZTecmLps*RK4X(nFe8m(Xv#=r z?KDdYv52y#g!ypPVI7riZD39b5hJ9BSV2gJ*>yC1k-N(A5C@@f2z>5kUtRd^ME)X%7m#Gyn(o-EfjB1 zLP+vOj`>@TcnA7a8}+`9iGtU|WvqV0!k2TGwUBY6i~UgJ z?^?mn<$6f5^>t_!HQfK@Du!fKP*Z$zG4M*Xs0^zI=hN z^%-2som{`8;(UEezk^&K!LP6-uRV)551*ZYm(7E=PQurP_kc65*N~UpG(?F2tuH6r z3rfVxC(gV8YQKHRRML8LgFe5j^*D=YM#644D{JB(dz--ft&fAi)4$+we~%8cJBj1d z`RMQN9Ph_o!LRq(Xv;;0T0aOIo3>W{$^-}afbcawjG(0^tNwdDtkHN4O*0EG&^_=K zW7wIbIfK8e2A`jgrQ%Mn{TIcaxEEoT6{}`_YAf&n6FnN%u&&5BX^rS>dGqOc3 zEr)1=`SFKh8|*+_c^6uBB_bfAz;kPNm#fvbxKW0F|07_V@IosTUoeKVm?0f#kxuOt zh9_I14^ESd#`!hPlrZHTud^UCo7qjuem=90F6w&IKX!@1518i1T_;N917ii-*CKDgI`rWh5iQ zLjBCv1bO@V`JrM4nCGEZn4wP3L)w+V?(fvPT2`h#h_X`hC}%cTo+rQ|w;S*bv!!8+*{C9;*6w~)6YPU=VrqYSFDzPHpmBYu+f zJn4MOLxpNWSt;B3iy$QF1L1$gu|4{dab8G3K(09dM{zSYaxwdF#Z3#=5qH$9_u$tM zLkN33pCXz#KmazZI4ACbx3)H?@7)bu8s#1Wag<0eH$%r_Wru*>hW`RLi&wCXS|?lqE5YSUoK%n+eJoy@;hbrhLv*B;)fPs-LM$W0S9rDo|%Wn$7io6TfocBl&2sVUzN z*Pyz0YEC8Z>sBe#A5Ej1cj(fstjEgxl%{5n4&LD@pG=-9kJE9^l-#GCq0iiRShZd- zb0)Jk>)S9u=GK^_S0BY>R-vgZiPR;rEM&6M(wsF#(7;8$P?em>k!YgChSf3rT{Etm z)#f;fKFKM#|MB#u)a6*UFfB#7KMU0dU}xRzB+zn9qfOqQMNw*GP`@3^Hm78TPHF|j zX391)C1<-qbrG%S-JdxZGV|-vX{d8i*%YibEsR!~FFj0^xOgc5!=bbZZm2HYcm9n% z_N{E%#pZW4E~+HjKgn(~->%7c_LI_W3}Zkn1ppso|W?VLYKRSE*fqH3$L@@B_P+70|2909R*KP|yi7|M90X z)59iOLuXB=_FS#P)EJ{Xg8NJdm3E%YTy4xgi*?;+&RP|hw{4u-=T%~`q~c+aCo5>s z-*0#J%wArqciAM|0?}gCU-wE@Jv^**SZuBGo>rcD8@%?l|HO4pI;Drg&+5D9nJ62{p zBz2VGw~JPx>+QJ|I&*JMFSL;VfHF!K4|KX_Zm0k$C!zAyY0E{cc}*}BnkX^6Vq$hE z@8QhGI?Ehz27OS%C_s3^85ZmEPOxhE%-J{+EVZK?7DxH5*^nVk_67+t$-}f4LJ=-` z5{>XPJ*{f+Lu0hB%$}m0JpEp;U_EpSE0Q+ZM`vJMU-?BtZ18jsrh&viWPaTYkkb6WFYvK2%?5bQigQQhcUy_rLttM4~wRW1L{V$NH}W@$nIAIKBw zEuISKl3VUqQ%oPH>8m2Oux(nd)^~H3>o{msvZyv%FiLi7ScA%50X6@d>bIRj2C4F*N*HaIE|v(cKZf7kQa(XC)@-l;Y{1z zTk6=s#TEF{IuGFcJ%xJde#BBCU7layK|MUMpO>|M8flH_TQGl+YB%}z)N zEv$zyeD6?sth)laR^!e730Lto40x0pub*rV<>)SfF`w**v68ObOGSvaf+iKC;7b*r zjV!|rI1ZxZ+R14124Op?!PBDp^v9PsO~N#i^XLZu%!huqcF>}Duq7x063>WJQeMD41ikq{-30tfN*yc-{HAcQ zHPIkjP}Ap$q4wAdeKnz!N>%b4PT)^Q||sxY=X+KMRl8mi0+O5UEgTHYC=rXIN^R1;?4m!{T~1iW6t zJD5j3BI%^@e#yPZ2vnZ=uyZ15!L`e)Q*!*r+#PmY26I$Lkg%MGV&<3 zi5crN@~Fv&70)%&bBlGZ0M+UP+NPH8Hxsr>*>H)9YYc~LtV>}M6s(l~sW(>Y^b@pG zu7M{;-D_tz`PWCiaf@YbgIM5sAYU`>lVdIZ2n(bEbRW+Kio?lWn*!3#8R(ODPH+I1 zE-J>7rghYG zXhoo(B6x7X6k-qnNBNjoVj4@fRQ^Nfij+7qZ>!T^7o?V|S5<&AkR<8mSArjg&4~Qv zoZh5lwmLQR&%XPEudq5zMxCBw(p7b~?U)MirFkk6fUyLkvywdh$m#aQWIk-XGC1zbF>Z7{OYT9Gh z$pEhNQQMMs&Z=}&%cpFJJQ|XC_YkyWWM;`GSUBKoD#3K)eX^MLe zfRU--auHL%^w^!0Z34Qmw^BkL&>0}%3K^H~Y>}%0WAM>NI;Z@PhR`BfcjzivENu(< z)geJSCzyn&3=c!f0u~k5S>0kkhWHhChhkLIsF(nMtL~H^BvTjK=~)5*TLAcqs9y`T zrs%~fh$b(^j&XoaGb z{OO9R^8f{Q450|PHkM&L?N?=p3njcZNHqFh7J1WnREGn`l{geQc`#;P>b@IQ!^aG2 z?B1-Kez@bC8FP05MNV6)&?ajca4kYgyyO}x$R%o9;q>CH{}ctqELp>VfWTPZknnwp z%j{4?a`J9Eq{+;N`H&a-ONVTpYKK4>JJ@JS!N2huFYk$75XtaF-)PVatA-jAZFv@2 zPq~cBrFj_=M8-((Z|IVJ@l4-8Mmn4Kn2iFMHVQ#*KVUNNp}hD4n>kiy(?bjyK`m(V zi}f+NQ(5#5zza+UAo6k#q^I`Bmm1P(B8gi9yWkPWcOu!7C(>8XN#A-ilu>%hfqK&I zc^8}hyywUa{Wj@;58^UqTO@<`YM1#rNTt52-QCx@jC(p5m+VN0C3AlD4ndy8EFmJk zNSZ%%%U=q#WbG4Q=%GzWd#m*nv7M)yIJYkUow##@(YV%QqbNW$SANXSA&hVL+*P=B zad`cFAI5ode90!r(g{-}kmpEmHf*#8@=mjA);U}?PS>HmEC zFFxRFy1LQ9>k1c2t&2k8<3{Ft`-b;g@BCx;H_%b~?vN6(m@DK01w*J}9=h^hF!S9draS)%! z*cC$m1K8`&x9ZXF(=A+u51W@BnU$Tl^>M+k-O%q$UkktQ06gjdufcb{9jF+=$NBX( zd5vvG0q<`?v%!Eni#~rjZX$=bV;RwGjgQILfOmrT`Sr9u^>43($?_VD0GmMa@ALQi zJOT3BcfieZvIA#&$=~sRPi%d>H?p_K@r+Smyoys$_Hb;xSG&At&M$O_4IBF1!SAA1 zZ}gi3pTaBgn#rH`T|n3#pBV{CZ2>SWhi`oF*iN50K^N{Dqr|*=xgi_sn;D|^I)_sT zZS-a4?RJej-nxRueYVc;Dqvy8RL#p1 zk7^#lduH(GIuMpeeAvn{g98tVg6o=VN6 zEWDdp)7Rs>UFOsBSckouE$VE|eR2$rd}^G_P6)o4)~wU+D`*B6)Wt6jKr<}tpanmC zuvuuK97+-A>09#ci#N`Yj$BjX=J;I&a|Fd$4)HeaL=5Jj;H7 zf8+U-dBgC__7B%D-znZH3y|)U{SN!0|KxoGeG~Og?iKw`?3Hnt`!2d(Fqqv5DRmTG z#icMZXeZyq`H?j2rS7Ti#W`Ad%4s6jL%k2uZOYQNNK>Ba$EC`|HHRkq|QUDTZFtmu23at0Bv|;vlT}6M* zs$1=a9CF=~WsbSiXc}Mw>4HpV7i8Y7rd>9=M}YMnfL+;Y${v5i%nDJ2}OyHQ^~D z3&t|Z{%gvNkD1|y4~;()u!CH{$2@!`FKZSzfhjD}JJ!5Ckwnywj>vSz38a3+_U{+D zen_s+-X4ACG@O`l7;oNKi4ULed8Et-OxJk=dtXM<+--*}a_R0zC)Mf=L9roKlF{^+ zSB5bm_{YDgkk8BK$Iw`!lT4-^#Zz3wzeH2`hzIQnpmd#Ogg#U;*wEbABfwXGrhKt^ zd;iKs#m4q{|JJTmt0ugKY=1Yb@pV3(e0O2Ia_}GA?!deb*>~ah4kQfl^>OuwBgW$X zI9;Y`dTf0}^G4*`)_UGS!ny8Nsq*=X-=zVCm{jobeL#=cAPSrA zyt0-8gi?gXYUcG8BnFp+wy1`>W#Xs8Uo1(-J%)i2bg z;g|LtPHt(vwQ?vLc=7uu>|M$SH?<9+2uUtYJqJZ)?#p8z{A+O~3o_C`;?-yK( zRX|GFKz=IB2}T*}L1c2I3N*74Q1Q1MXuraLJxkz)p)sI8qRbGC|3j2%;$UxXW$~Ym zo>Wc0AN=RmH~549hKl3(B2vVp1#nWtu}Hjts1k{&&w!9ZDiD!S$hFkTei1pA5Cs8+ zfKpAgqO3Wux7?ED@nAo*%&7j}u*#}eDymvwwaqFmq&xq% z?N!!isI%3Y!0s$=+aTOV@5$4nR!egxFRU@xFz(_!A5PjcQhBuj*D(7{-=FRKtk}T!)D|$Zt5;0RS2mFdZBDHm82$vk)LA^Jt0;XbXN z8b&p0*O>9PCO20dIVVT813#Xc@R zxb>Ky>YV@nrv*9w+Z4%l4dh>c+&IIpCu6T+OP#tD81i~_4xP&7SbE##tNcA99!;dR z6Z1%0Q_NO%YBp&e?JnK5i3vMw4>(5b;=;Wn2`^3j?Ic>XEaI-PMt?Rw-3df}m;q6I z``;A}Az`SgK{HPHI|Et?T;24=zublL-jRBmkzD%gFdQqRmrNIsC2ZZ zJCcSk^QHEXo;5AhNq&ua<+~yCcltOGv4F5-J+^BjyNcup84oKM0+)}2O%hy9$e;UQ zJ)|zDk+=4{J@vV2a{og-9H=v%A%;`y!v%wjsEPxKL@lN+Hl zL6b-)I)*3BndToS{SGO3-J&>irrnQPV(B|ZWumC6x)Ez4NnpSTa?LEkt=MYtkQB#m zXabL}N|jPf`BZmCUL$kH*+g2?r_+h{qqsF{R5%)Mtym2n=C9>`B%)*w-d=qqrd%dy znl7f3#}ZtH%C)O%$6va@!tmhOGHp9f|IJ`{bwl-6a#&!8tOVz|a6n**5bgc2 zq35?CF<=VNbJ;)KU{2YTeAvG=AZwSZ08d80VHT0P=(H{eFE}EijGlk~u!oDYBAkhj-7&N6336*<7=1|u zKq3%Lguq0JIf}1nnvZ3S^n4UBzbX*-vZ^O3;nY&D>J+5JXQb5q^U=HG{t}JZN;!#k z{%Rxj9*k6v!N&|9m^?TjtdPS_d3Zo`eApI{NNY#C1g(E}!Hk*Ki`~hXn7qH?VxYkK(Th{3gka;*r0hS5i? z_RVgq5;$!MY{{}fR)Tji;=^2b5uDF|NS;JKEG|M%kM-MOasasO_QewPiy?rrKyRR> zX|Z9gf*Fo#9Wl4&Q{ZxT*qqilBNX}ZWs{7Sc;fKj^pFK)CN7)Nj8@|kS?7ddp<~IS zeP%kr<*e7ne1XgG8YY(;-gTVg(_^drLCgCV!eNxUiVA~~4l!-5~> zR(#mSBssy_7cM1+y5KO!c5Bf8;wt5FohVOS*@9C`Ww`k+g)Z-M$)7CGUxIHic|rKL zW`{SF)G$AaRMSIGxunEH8wnvQ{`L^=7-%h2e#+=BjCH(@vUQh=fp7BK_FnD}{TQ5# z3_Zz`2?01be_1RuMb}8pdc4n~wXtHtDlQ_og^J^!qFtxtl7UlUI&Maqs6Tl}K^wgc z)iYXoZP(KOs8fYSw9Yv4ik&BXpb(YU$p6xOr93-IOTA&MQSKFP{AGuW5NR!pCS)F` z4v7@*nH>PO01kPQjlc}eAPOFhW~ntfjDICvO~52=iBcj-(;PEt5sJn-GVwaVkbtN) za;0_u7plSJ{p*<7oBU~FYlW#(20lhVy65T12dhU;vgJ8p$V&H?A5VdSgpL>Y$Cv{# zK1GyidoRru?ORfjA^Ch)yEWN-b)@x-k&m42*@T7WQscwmb84t@$BZuf5CmgNST7SPdUrN{D`4$9cUcpXp-hQUfk7rJERCpjHco>j4{dbFY~Zfl z)JK;YfWaj>Fio?_Ch2}tVwxn56+h4pvBZ%kmlS-<6@y;U+Gw3bj-}A=iC$$_lZj_* zwF+0O!^ADNKAzlZCmsr~9?xEwAdpv6OfzMwIPv?ZU3goee{(7-jd(0OYO@db)h7Ss zTkH4w#jC$M{s?^wuz9{f%}?lAz)xEDW%h9_+65L70&gjJe;vVRsU+KG@tH9~~Jg2h-|LfAhX%dnaLSQy-@6gL1qd~qBD9*L)V`s_4`@|)xp0#D)A(0J83A$1zl8iR$LNf6 zw!^r~_JEO%0?YSd*l_dtV!pdCZrscloYbOL`mY$?H|Q~7%41|niznB|Cs z4fpX&acg@|Qws|BjVpqBFUOyKXjgFUf<&?RjDKhRo>ua@UWS%npIJZ)ulsIi^pL%- z-gEvD&WGpmyIZq=Xcga;*MGh2&ocF->e@_x-o&~vZcjeO_syZddz@XvYPh@cKgYJY zmppy_`8Xj&*U!Q6x|VtWzVZ3EM*LVaknxqb?HvBc-?V-(Q>rz z0p>nBT?wdqLY05jSaX)F7mDM4!#S)dt`|AZ`AwTp5?sma6LF?xfyn#`a#(N>uzd!* zfNA{b4WBRCCOviERNW8#Pht%xh5YLM1mXGWb=kwf^JADX*Y_wO@BJ;6HnQW6<@iba z%l`PfQuW`k^qL`r@~+rF&fc0iO`XZ5I@a(f>0*7VWp(bhUR63)SOeW7zG3IyMXFP9 z`}-47n>xi^vZwcKrRk$bkyihnD%^B%pFg;QtRB7;KHgVi&Z!$X>Z0$WRX7u2i#ML8 zMQ36&6c|k|XKSx&adl|_q&*M&rA`M9Kh9!U&tT+q8(|Fl%nF0lW2l5~AQvHKra35eFIM340G*0o~*xz&>+Rmsu-5dU!-rLE8&x73$fLVEPINh1=EB+Sy&isP?)Oa&^0DU8T zpnM28Lj16D5#L_~@ER1kPHKzzfG_#12h~RjWjWUhGcv+`5S+Bb{ zJ+21*PL2dN%R6=q=r^SQ5T6Wf={>IW`F|^~H-E?V3K{+zDV!VFfWS>%6DqjB6C%3l z(RZPA`F}m4OE9Z_WhaS-Kps7s&Dxr@QQhJ4#*)8Aoi;uCeTPJ&GJ;%JY>keFVMC)fr93TI4l*|~=4TdM2p#DfbQEUSK2-3*V% z6}`dDTU1htZp%O1mYth;vU{Pe?f%ems59&I&K7#~<^G_SgqCd;|Gt~S+3PqPsj6;R`xgpz-XNZ2Y#tE&W)1*9wwB_=SA|~9N|D69I^$?Zo{Z_lqm@q5pBz9!|PU+@JORw`+%zo#VwJ`B@qXE)aBLR z5&?^|DNv;&ycBo)B@@*=@eYN+Cs9_@Zi$a1>1atQGho`qaj88=M;QGl7?Ei1bflBDF*BFWr@$J7m zH`KCe841+X9^0=cuk>0CX@z&4hWnX88WW96A;(NJSL zpE$aY-t5X2(yW>LDmQR)DOG;Q+bg6`WJ1?xB)h8MM4CTCpfNfMTH|Yy64O_1)csmc zHz;l?rcs3TY66$HWf}R<>FEB* zL|n94niANy_x#HpEhGQ9UE#ZHWLpBgRjL5($3;tKN`>b1-7HQ@IQj*%>qF$&@sCG- z`a;=-OVucSs(I;X2uacF=;c>nvAol{y+h#n@+3@f+`szQzei$B!9D`?i3;YX*ebB| z=9Zhc=WFb(0BK3)vi2NDNcS}f=vZ9+t%QclNU#~AQw;}@Q(3-2?xpyTcqCY68p@V9XU(L#W6J#1O4H4Q-Gngh_UoyO}LUdn@ zWjeP3nQuIm^_->l8|SVLW3L0q6dMB}YqXEsh;HvXmvqoGEo&@xfp^vkwFumT(te=5 z-k&Zu{WvjyeLk8LcPYC+cfqAwD?g_y(GkD3~csI@3mM#sA+iRTd+hVu*x zYd#IiygsA}UdCtr<6udpdb_0koJE&4^c1e(WNS9 znt#E_o|RXTy5U+^An~2R_iF?$5(Z-1H3zMQ49H5CjbXfj!258@rU%Uh(fR!0$%8aw z9qa9X6=}lLnaf%Q?`!8wPhbJD$lk4TLB}1B7ppaTi5yf9gxVT_u03?aEhi!}JikD^ z7$z6r(*6M+Jy;Q*c8k-Lk*HUbFn}(upMObJ_Rv%SQr9DY6!^BIKaGq&y8Sm`#@b#3 z%Nxg5j7F7h80q`$$!B^S@w3Wo0Y2)?o2f_p;2*MFyh8}5H=Yx{ok4Z0UBHHVf;fZ^ zA24ja#}K=iOKef(D;u*ZE!8@GV&F@)58kO;>>id69c!%vfK{3^FA%K8z~}Z&BEWBO z_@7h2Cr|tiP**s1{JL1kKHNUhFZz z#J9adCvW;?ZhxB!WQ#{f&4J6G7qW<-kQEUvC%c1 z2HXL>Bipw0PQewq7g>;f zY#&QGcwd14Ze@N5tx|?haWBkGkUGemDGTrs%Yu)05ZCm=fQ zkat06RuGp1?`11`{T1J(jEuXV3tSCO_E{W9lh3*Xl+F9hUYC?r-H2A%!93W_t+$Ie zyW|fdb6INc8KBc9ffy-KgcDm0rLzScke+)g1EPpyiLB5@;m&Ud=7_)zMZo(He8wJ` zbuf}bx)%l)sZ0|81UW4qob6_``v}1WA2jS|0FPGK?yls6f-OLtgC*iEAv;VjuItdhgG8KN`<|l67e(jMD3bGy}I$Uspl9+eF@-Lw5e23zfM5gk-61F|dgy1^uSUE81->en&z@BC*4FYTl-_pL>~BUP{sVvqZB5;qD}DRFq&oaL_i$n$B%3c=YL?`rJlx?Xd7t z8wMAHvA${vaUkJMAip|#C}m^>lD1i>yNBzH>jios1p|-qG4iVl5pqa?%OxMC2ws6? z3Q+Zh{es7a?O9cEEL;FRfED*L{RFg3JN<}Nt5OvkIXG7Bw<~LY9X^ucY(mh7dVDQ; z*3*Lv#a_G+h9huQL>w6g&`G`MY9C~ToWm#R!+mHwaLbXvINUWpxPRgIU+GHrbu6ce z$9~xh9AS+b?b+PbD7YZhWP6pzBPPGPd+{^$9?clJzQTNNyct?0BJC?PolhAQwyt-V zm7{tV9ZHSkk|IH%;oJdbezyL|D@8sk0f52~UmCIkieRjOKA<}G>{WAotgvlX#|!+$ z`(G0TO|}ukcluIBu)*cyEtq+|eL)nvqdu}aLiYTqoiNS00CfdV>7?_p|A@7G1rHP6 z5&xhxeI$%h8odIyvu-dt+a|1y13N(tza-d&;zxQTmF5K$Byn%dN6 ziYc(+g-bMQuB(#*Q~U$CN_5gz7!gMs5vQYsXUOK0izx)*Rwg`q0@G|lqr=2yP>jky zPXxd`r)12xS9ivCA=+sksGOU?5ZbT{Y+ban66BA(b|H5c;Sr>d8{t6s>X!U%{>j;@ zzJ=ry04?$na(zK5BFqvakH-{tW!&V(CCFB6MzgsbAP4}m|BX=&1K3GBs;?_HVyZf~ zanwDBoPL77C4$&$8bu5~BbKVuCDQtvh4fx9qSPTR2Hc1kR*h;+qd(yaWX%`GL!a!Q z_19S2mzo@B3K`MN-E>H_e^*#(rMal=Hp^g?Pk+R0Bw>U~bRCoGGJuT~JixLJC>f_7 zl$&48v%XNVmch!E)Eg6!zZQCrzF6*#d@04frkCOxv2mTGWZeTib=Nuyxryi z7sZW3Sdl`jt3nO@48dWr@UnTe8_0!lh-V-XM;e#OE9(TOZi_ByyWnB`pUB0?-DY|Cn$K0b@A6WxfG7jeoxv)x}dd*BK8*R;hb^?n^!#ong+tJGGQ@ z-pF|7Pd2h;n-~*qxVKpKf^#u~BZ)`t2w)SzRPoov&%TML$KQjP;alXpPZ%Za@u*X48Fsf&_>@jd4JqwLKdWXu^fdyXQNiZBsOV^m(M+Gwux0$SU1a|KP7u_AR|Xu_d`{tl+hRB=RFJ zXh33EenqDvq!zC($QonG5XgP@zi5I0XdM2SrS!L9S~|Kyq`_fTHUCbcUbxIi;9HuU zJL_r{efCGmTgufzNSz0sb3kw#R=$HW0qJ<*|5`QzdA#g>Wmph2;ZQcD~x)~jB6P4_jj z^M0rzSiFNi|vb!zBdlQZK|yRS$H)*AB2*p)A&Ow91A93hlG-U3L#b=ch8hzRF<(d_{Zudk$ zo4K412ws1(`LjVqMa?#dSOCX;oiqBkzsjQVp|BGL_1dZ&yV9@|KJWI0cl!0zgCGEN z@$bMAA+?6&_!8h-<5%+{-(rLLB*)ZGm~^;;;h#~0fOrJri2R3W#z3km!2?S!HxX4m zV(U$c@j<23qOpi)XeEQDTv^{WTKd~cQh|k+^2yBGqy205uAvj0Z(Apm2rWPWE8tV^ zAYWxDdrw02GmwS7LV}_{`ihoq&lkj{S1K|dxSsj0H037v(cP#RET9Kl8gvwV; z$M4`#!CwXGKn?Y#*=t6T4s2h)M+Hm8F9H@AzlI8cqr%^|f(`>9UTN`f@qvF9W+nT> zDt;;*>?pHG(928i5Wxkc)EWdxN7jFKJ)QXDzaUJFZ3_B)z_MVn1pp$i$AhTU8n4g7 ziK?`}>V?KC7>$O$f2+>yh^E)hGYZiG$R(rtf~EsJKlq$N(!aA%0%Y_Ph64VzqQxW$ ztq}qheB&W~3t4}faR2_e@%o^38-}w-3y5z`bW+L+dzD7LkHO*Z4GZvyBxL*YSXWyC z^h#fT3I2ew?{718SY1^$oW6A4etuF7hRxedJB@JHI4&lr=%2_&;{IX^s*Gxz!araU zaBO_@24$6*X?2~oWy#W7g_>PWEr;))nv08Q=mxJubnN$yukOE}cs*toOOKx4Gp_wl zc)zbdx3Vcbhu;iGk@Yu;dE434q@GK%|EPsxdUy|a{sLjVx{ES^2+79e@pSTt7%Zfw zkZZ79hN^F8$Z)X?D$1lFbnj#ABB=03Bbnbu z=?Gs&T_h~1l5eFT5I}Vv_;l}cIKDXS-sqn<7|z#V$N`79{X@|C4P^~z2H8glv@9Tr z2GJK*Mf0G9LR4f$7QxzF$F8YrqAAY;Bi;ml`F@J(0t!f+h=wO_l14RNuF3LZ7Hi^N zCDtY>^$XGpUgdcu+3(&bh+z5^1O+U@1xfV&fylyl@f_s?eCsE~hxA7n#YHfKR7Rm(p%c{E zj?Kt@xb_;4^=Q0dhOKQaeKMHN-Wyi%ib1rBQY({@v z%HL2#R<~}5hr230=&DXYjQV#`qy3uf?Qgj%Z~Fg1*Et1e!i3v8&g2Uxwr$(CZQHiZ ziEZ1-#7-u*%`dij{@Pb(SDjP!_Elf>Rd-ddde&NjRftFhI+g^3zpn&$V}-^R&_kY? zwcq&VJ4G8Ah73WcsBhn*RXWK-IaLE2PhAk%wzxIjB?SOd!H*=5QEHvm*MwjFF&apS2+sy&o{@)V`0%%~6cIKDucbiA^P%wRy)nwjY-8 zpkB+`$r=y-3VZ9p$w zKzvS9zF`qQ&MEq(wP8J}dP*dM-w58NK^0cPW<*G4NH~LX?~uU09daH6h54VO)j&GX zMHP@s#-xe=U>8-612EES{{3#LFly+uM%$inl9Wmrnh|ol%F*A>FYN5QJ(zVhKUIGV zqnCE6b&J28Yk!SW&OAxDR_)|_y4r@IoNdmverIc>I77EX zFx^2%B9&3=hVM@gJc5OGVBxwNVB~J3vbz*Aw$`*&XYeshQwuo7&PKCBoM^gl>qlZ! zktw8FF(yhOBahf7wP5y1Qx%&tKxiYJg9#?tLC3YgAd+BjR5MCH4QnN;=R~Yot?r(_ zY-#^ZsuprR&w*u2Wm9Dgx$UKxlJ|pg%A0J>fpczbgJOYL7%r@hl?7xW^%`j(m`g|U z)G6nyQJdcl2h6&!4OwvwT5(+#o*=l-!7bC+Il%6WU+TTGza~9rbJEVxD`oFH3O~Tw zc><PFlx#wy*n=PE?rA+p z+To!DIF!GZq+G8b^Ge)4|D5>`dA@rz8Mc^(&{@`$Q@uk?6d+dKJU3}hobkdK4S5f`&h0tgx3gJv zBH?oQJ8!}RXIjl0FVsY7Z_R0a8uNTVCzLNXT5Ln~h+d@?^z5bHOWe$zg<~ZfC$%U; z2h;OvyMjP&%UrKI!;JHwNBjA7f*a;^kX2Hqln=9Bi+^r%fAfAex#Q!gjz-OQbubxm)&B zE?@d-o@Q(3Ma)EC9`NtWn*d+d`t2BSWpww?swjK_SrfU*P*%vDo;ioU8Z{zMxte_q zms`;!^T#Vknm?y;nx*~2J;fVhyX?=o_TtVyL(G>4-KV$cSn9&zz|QE_;eR=ze;&^= zKa5oD*-7=UdCFy^{XOmmbN{e=w6lx4-3ZXQSQjrE1$dlA$9{@onc7asgjiRHFSB$1 z6b`Rv#qXTvuKSs`i@bg$CNn(y{G68ytIN2^Z11_LmC{74$X)b(*;nW_5S+0^!#U&*tc@A}@E4_8APSPEYyH$C&R`f#k#<5WBOmfGG zs(50@&v9dQpkxxAxvr^M8UZ*FSQG!%#lgy0L5 zPA`WeraTCJrG!q+n1GGZgA_U>>cbe#9J>=#h`T5pQ&v~rA9q7@S~(3)GS+ZS981Nx za*87WM$tbUz5mVGLQbHWIL?&Jw(fsrezzNj4|*kZ_}TaWIy`INCYuN?#{X5EM~VC- z?2a1ZU95>3agc~oT11-?H(HRch=3jAtVBdDURr^xMu;daa%PF-4cZf5R#0ilofTwW z3@GEOE-@9SrVBD6TnZ=R~RQ2)zX<5K_AqPU3`m9irmIjUO6u@Y|CWKg8u$lNUc> z7{!r^eyn~U@X4JQZgJ3l+x5!e$*&)av2W(dRX0d;H})4w2IGL?j=LM* zVL1C1y&LUjxa*eR_ZPu{#2wRCsKUYGD{XIJ-w53+@i(Z!*vqZoCy2lx;@#{k2C`@{ z46*q_d<#XcB*sGABO&`jvLUk6<*<;k6r2>PpOipRB5IN}R3ecnCYF4YBs-Rrcyju` zNz#Z|iVo6*zmoh^gkmK*s!6NksLXLwge>E>%;{4k590>oK1XuOLK{d?Eo6mjQ7Dc9 zIiVj#5Gj#Kb1oGO=MnEDaj-u>RYC;;F(m{6`46c0e~}dKX3qat zyN0h8tSioPX5O9T3f@R^ET1zna9@@f8bx3%El1PqPZX+_SH`dqj1*xbt&E9Q8!cB- z4)h;Z&X!OON6%0MGpf08{5DruKCV)_Y!QGR0F^R=9(BULFlPbUuH6>V)~ayQ-{XW@ zDUcngJDdCSJ$v*06L2HSm(6go$LXfQ*nP6VHnN2|#+B}bn_fGE6LRNEo49FnWP&o{ zT1FU$^H!+qKUKyRagZ5Iw0Zp8&!Sv=gisOQgkDFj@3 z;wN=m<|&DTLDg^#3dCq z-E)3uZcQNmSh*xx4tKV^8ECnT!5EL~ylyomZ%dnAGo0}cbJ#e#98Q8boi*npd@*Xj z%9Y4m7Nqo1O}xpO5y3-+ZOBPH7A;PgiJdhu*W4y@UNKDVs(LHMY%SQd(~dh42M5|+ z%8A#()LBzf-ONSHGn8?0eTj9As_~By2|xN|2{aAL5X$;|Fe(8p>cbtxT&MxdVWulJ z&d`c>bR1~~$~y5bx19mMUI{&E+?Tu!eZ0x!o;Q7UO07{jO3DfDgjrJNgll|Omi>^L zaG=9|ijiA9?@e=LqcOesVi9$`Z5e|rP&6hii6$$1n;qg&&K#RonprcDo{im;4FI#m!)9Fx!UfZ#&MNfyOy9{>-Ha#N!04037cEXa@znBNydB^ z6?}(?$)in^cwTvME1?!fkb)!o*>{Z`PTmz$ls~ z#eQddEoqIWO!f74EV5K3Hu$3ohHrgQ-i)>dEY)R?4htAu3$l=?4pFYw(b{hL$kbqw z4jW!5Xp24UPR&x^utoxqxdkt+bN7fgJ?Zuv>2wF0UQ`;3As4d^hAATAYUqW1Q@K0~ zpd89z#&z3Hps~fc>enu~=~>P7;P)(6L!)g2=OFtkJ6YvlULT?AuYaBSkE~;?cug-6 zE{wa}&1ncu1RWFsUe+KeXQGWid)L7age~8GwLB(&NR8h;Z zeeN*rcq?Jl8lw92GvDP73K+(%sPIZUoXt4Q=1dKk=hanuu!sv#N#26F50lc|qOqR>DZKgdJmA zEAFKf5c*`7W=@pUSQ|+UE1UG5CVf0cR%JMJE(Hau!ai>}KWm#QWB7K8%=dsHG4Hxn z9+D^OZ5e5$4he^8Bv?jY=g}w@v6uRUS|>`LIdv8=Lbf8PahLIgVxt-PSgu7!h}&JINSQClIeWS#94zgq zdnw!W!f=kuxuecbWl6le$uZ;XY)3}O@E5}( zBrkOwVYmq_%j8zLSS|pz8A?ot9g?`{pX8FKN((QX*9gv327`$eqqi(V3QrS3kxn|6 zJltMJ08ee8HxK)@6Y9;ZkEgcycYvak?Vsme}u1C`S0 z6TDg=hSsiv#e-w;AofJIi$LPjB87UXZjdIdZumtuEsu6XSRFJ&%Ot3D@uR?{$WSZZ ze8#M$iWH#L~q!80v1UzxScIiP}&7-qVz??`nMdNrpk1PnlwfUgrPWuVlH&d z*I^a8wiqPquH@^#eyjp9vQ1&YmXP+6sI}Uh3t&b!Su4W^*MyC1&r`Cz7D^-#SS~4j zT;kyP=$go1Dx`F@c8&6KzI172yz2a-UYc7RkTY= zdtf7scBM)cjec%{+>Vu0?p}$(w;5_nrWE0YxpHxv&h5Sg++THQ*`3h~EQ!EpkAXqE z@18E@f_i)`S-#e)?3ua~V?5moe3 zExlC(=28u`2IfWj4=f?ZlA#d)L3(G=T2(P~IRPjXUd6WGF;UUnhLxUsW=S%Cde(5n zAB{r(bgKpBT|j;dYOVbFj0|X=>tyFj@f)$QXq2ZL0o`_>)F*TP(<8z)}j#c|<XrAj)D7(nmjdc5& zk9hBLkJ5$BGb%Qfjr}2u`Gk$#1raRnk99VBi<+DLT^YNHBd5QJ}t4$0dVi5)C7 zE+2|WSV-`((uul1q$&PB+w@DQ{6AjMjUeE1&dPzJWsqa;GH?u5)eNYx-MNs)|$}MkvHlMd^yk`R-ous>)Ri{?@*{Zw?7J%9X5xsX$k#6oCL2+W$ zCSCOx>^ob7aa+*1)+Kp++aILB@zkgVnjCwmS;G=K@xDSa#+bhe zX~WxVMA4n3Q5`k6Ji$n4!o><{qduN>4-Z}m%F7O0TH zLPE-q90-$OXkZ`v53T=Wn}`!+Wk(`vT%Fy#O5pO$b5AErorVlF!O@1R7N~X{%zrowAxS$-N8PB$WvY zP#bv(Nf~O3>P*gLcrBfQ6M@zxTZ7K}D5W_sa_WRF1eQr^_OgbWIBPieQgA3VNe_~U zDCx8JnCDFR3=+wAEC`nmZTw0As>CRT&Fvv#!9*x02!vQ37b1^C?aZJ+!GK6<1K)@l z!Z&7$yt+uMLtgo%@97BA9tr-p+-E;XBOa>9n)r0t(TNku8F9~{1v>zF7mTD13HlT* zm?zj~_^Mz>UoXrdl7yAQHGizrBEEkq3Eir%e{r)wqCp=1B3g(KOkLgmvK_;TYZKZP z(Xi{!&WERSszK*}j^iiDYmc>SgOCf%ErkL@1b3PIkdJ5%LOig*2wD(75XL21y!(#i zmXYv^85=L>NOVMdC*HRlgU)bk0b3g8z@gUdh2P;rq>dRa_C4qb(+j4ke#Xp4_*H{( z5HM)M2MNSUHj^ZoEq)PrTh(>N?b4eoZWy9-#uB$)$)<*!kV6K)BqbUhBxYC9?1D`c z`{dfKT@%|=nzdY?%K}~b*6Q1NOqyMLj45uPG|OOoAHiI(Hn-qkRf9WNLAn}sI<+d4 zkJ-SQGW<`EPxV^FI;Boc^Bo^IqxFYqtJj*H-fPwH&*UE2;jwf2))}@1gSsIN{23X+ z78>oXqW`;6f!$BMe+Wf|BC7@{>q?Zo$$HrK>*|#e7kAVPaKvI(Bm_t}s({Fcm?=Bf zAwIDbD*k7jt)8F3oHkdS4lLvNf0+PLn`V0OG-x{wd!>X6)DsTMyT{{ruWgVDP?}ro zblW3IK#2cF4j;=u|8{?*9Ln!@QvzjA)Urt$zW`&pBE%0n9o%_PzJ|xkIo+T$#QR0e zS9<6lW^Bgx!ZrqoK74=nmAq-I;zc$N1<4owohYu6SVLdl&9jWbu!nU^#;)`aiRsrG zXC4~9tPW!iW-2DwC@b9Wkg-3EWz9c4m7^6@#s7Jl&`rpTRo1mI(P9JGvsaC#j6NS2 zPgrzHJ3{U%Vl94$r=OKPgg3nzmpu@_|8UyMe`)=5Z8K_N@jn;wTi-GmB`|zE#-y3> z?G2r_qUFw3>9UzPAu_kI%S2RdE4S^3nk{1%_?URKr7AX1XHW1q z)<39c$iAT*s?DE2#0)WWkH~az%`5%f|6=9%t3NXXL$Juye}cQn7BW8nSz+w@PJ4`C z#D2P?{wQl&IrGA}g;{KSniSY5m@HE5zyrEbw8`NcyhaVH`sg+iTuc|-`RCvTx!0L-I*I2$p3NWy<21P=hTCLIXZ^!`^feQ2zVl>yC$pms{atVQ5h{mVIb)7+Z4IU&GGgeXfc`X zIS|m1toH+M^tI}@UEY^xb#%n!>->xzx92SAf1cgMo0FH|P-mYL`(W1zJUw>T%jb7e zKO34&CM(!~d2he>#$bQxsPAC!bh%qx9_7qhVAy-vdaU+}&3@jdb=y5WP5%V%NjlIGyGg5 z0C%}RzFB-WHT?ZnO$ff9_E!mh_7rcUezyOsIlbZgevbZ*vG_TD+}O_}QK6W|2ymUO z!|LPAc-z}C8A-G0^-n(1eM;V}=c)8{+0^+G@Hg`cxD2rWmkao8yDisqC|C1J^*<*Y z;r-Yb>w8^4Lm35U$f@eK4*Ju5o!(x9dQh*R^CjeYGpqX|0o-M|*bL}S&6M<+*T0)6d92jSnZFA6_TLl!XxcAR{Ve*)GG zzCU~jI<5(>Gj_6N2zOtpX0D@5YSLuWUR?cw6xNQR(+Nf;ShI2Y6%rxS^&^suc_Elg z;=3yKrhICwN zg`v1{aCl9VHz1H%^@Kcn+|@tD1vBJ~w)FN)X(n}soEb%mWIXq0WJOzsoGbHNUk5XR zBG$CV({PIt4)!^i=dYdL&BofwQ+l{W2Uf1OghoV}+c0;_j9KqBGD-(8YFzE^QnObI zipp8h#(G;z?cvtJNv)r4V^OisFu<@rk%2H+NnUfKOewlJ1D_?F2HMIduIrF@bj!0C zO@@dgQ3119SLMUee#(+y8fV=7BI4j#n1BAel3;i<*4Ny0+A!z@e>Da(Nbf9O_~$F| znAm`XJ!;xG`xGTTdfQk~mneL=0rU52RL_C9Q}bW3*l3-Rs{;fkqO#!@PV$oxm^0+b&;U*XT* z*OJ$i*Ou4V*P2(8JFYv(JF+{oJGDEuJKzDsh(S~zdH_i;$+wcP!e`8D&}-srz`@Ud z88<&aANAt}<7MM@yd|WUr2mtARt@+75!rVKlMo0|M7L1X~BA;sBPrAE}Y2z>n}+bwkpJv?0_q@ z+kiL?8+=R(Ur?5&dXdQ@Uu0*MJ1`ZF(LIt!Q&k)YP#4p^p}j8Z`WO8=bO8CZ>ozZ8 zriOa-(o{nj*`%MoeKRFX)WAD?mNV(G^WcB;Hsc|0bv1QD9Q@C(eL{t+SUKJuCA2Yw zFp@E8n7!`^_8%1}7aie8FwuCChZxCKAwrc%ir>CvKLIwZnAcls2Tm zBt_*SJ*y(rX9;d)T!bYQ05rHiRR*<(^gO;vHw~)D7flJ&NSkN`mSB2}vJNYKlCkL< z2s|xO#Nb_ur$rT|lu{HRRLl-Cv{LkQyU0n46_qI_(Nh?isWQlEod9M~n%_;ls*jF( zyiBrX3?rS4B+u+RQMl=JNX@1|1jl;POD!Ek#EQH)W2b(4XL3Pg_Q^*^RW>|j{jEjU8b8c8QaSQ zHu1-1BH;W7-}4s`jaw^hp@O0YG-NA#bhBWmW5v=uPb3k{kp+18D(;Q8iJ4J<9568< zY1D!%t)cVzTGoP2fFBl+A;Cw8F<$?Y*qqu3haAZW52C4}u>1bosZx2T$w`{MS!^Vi z^H&bJ3lyQCtE>1ouIW|bj;o)a9p5sNL^!EC>7c*WAMw+7B>ORxhWtC$tKw%v{%^;s zjbw6(E<#?`j%9o`jcNI4a^wH@lB@iez>z^F?o^-3fB#I);Ux_R8lZ=8e+OP$GX6&Q zdwr}JPTI(PTg^m62S$K<$>fHKz0G_IT}4R>A_VmXH4wDfIQln5hSm9ELbISyMu^E= zpm%MGQqc%_>DYtd=Ij!fGGcjP2zks0c-X91WldPw`E!!sWxjEQ^MKe)S^$4m$N#d6 ztBMpLL#P1W!iib}04ZGsv8;@M^bwUCo}^ zr7(Uar;|dS9--F2339Ay6(KjgyqKg^I%mjUhG3nCtf2%zAK^dTxwJCT1Wr!cM*7_) zxNv!av>!m9Z8(df*)F(3$%Hb*Wk5DLt`YIe0wtXT%NS0=(^~m5Si|rm>({{4p9$^c zMXC%f=3GN~8%PHfnx#Jz?kE)fh-KqF$=&SbPa8RWQZ8*C*aTxa+tfhp1?%P$t?dTU z=OuOpV0Jjfy1mY6=5Xl^xgK<}+5_`|4Qs*Jy=?@1K@DzKCL1iok;IaStfDW&!to?1 zQ?qAAu(P`3OZ^*shq$pkch73y?RsB=8ej z#&(`FxVD^9mheDa*G{f_QIn4}! zM+MDVF7%;rp2x^j9fb2RJ_O)8@ou=r$j_9ND8D~oz_9^sC0KjmS&_xTFK|mus@{x1 zWUn40QlsABCb=yb=v+t^$Ke9n(*fM(pkHOYvO+_FG>EzpI-IFARu_Z~<$DaC=OtH+ zX~hNmhU^Gc9i^@aI#6NN#xOo;lMQ%qATEFjP*~`H%!9#LYm8|zXqWv|7{bIa=2MA) z1H)0za?tgU!}yxt-H}ACuPSrDE@LpX2F4Q4)#IVo#VID)v)Dp*De>yTZK(g*AI!i> z_K0E&x(-_#rItT~)&;rFd5unb`q)TvDgm$|r$&QIr|YWXN5-NP)X@lvsq%mY5{cu< zqvy%Y_Bq4V$)i@u;xJwt2l3ue`K+wkLWhm_Ca5Wh_8386CXELrSy{>r7$F1Q{liQR z9_q!xfaOCLe1iPDKVp{O%zQI}o`P40fnkfogf>)HAX2#FNt}YnbV-aSNd2_JxZo+H zmB4&(dW4L)j@Sq>N7N&l3QW!pLmB{7og2V5#t;!uQbU*?6*x2x#D8^=`J1{E#UXeEwsX2^H$#vpOR(^VqTlBO zaZG@$s3@*X?f56`9uVoW!zH%g2dMeMQUL2<6~mIHNz5~q(r^uXun zK&}eP_dI3h8_M<+M_%$bvZ@NW80W#qg&UA?3xMlrtQhpi@5r4=HKbZy*>%A&m~p{s zK&xtXVGI}>OC&Ww7UE!SP(m4FwGP8vO*L8zQd&hAne`(M2+y_IGE1xEQxC$2euUpk zPH8#TA84R61Ge4jp+%#3g*wGiD+}holg51xFzlgcrr39RL77_-p;rw*|Ku>>tWBPip#|RUb5=RgBMOs1XSh2Knt7sj-hL34YU3d* zp-ezNLIn;>xrPUC7!8OME@}$TLcm|rzc!`XKG{O^HE+;QnL}b^j?TwHv7%(KQ&oVI zPeH6&z(bgI{{t|#5G#PkLY&+|yja}a!BJp~Jlx14*Z7hwpr!t^c-E&|zx zv!`FsX9GkF8Pd7U#W;OdA%%fB#XvP;dM{x_LX2?+am>c#kXBmkaN6!7MfQ>bl9;Gv zHLZ;vlR>?W+F+7V;vDB{F}Hc4^|P9<-i-_p?$F)l_%W5Z-don@ezgxGi#3QM(lQ}C zegV$I$WB1-*!lW=ZgA1LD4S?fdlpkmyI_{$$g&0;?=7Z z?qw@#gT36r0bqI9$;5(2R~u+8*pySy?0Bo)x&>Yx;t$Lv-W^EYx^p+jc3J7U-tPUq zZq{R~@HVx}rU;cgRl@ZwMiFX-6uKzhJ@k*vkai$|7(?k*Hb4v;0EZ2*O&vxiXyhai zCWjs7_+Q$9xDm19T8+|aue{Nu8z8w(>2#4w6xEeSQ4?T60T3Zu791=s;K9yT%mW=k z1%vW4^oaQ*Pc2FkB98T^V`3+ zCTwTcnstPoI;uhk5-UO|tmRXqC-0;lT^@^qwI$3QHEmEnkRd2y3q}gddmKDh+2-cIUUK@Fzh7U3eb(Fb8vRVz79^- z8L1beg#SKz>#k`#wu0F$a)G-w?1Q}yE82dz$&ZW|2KF)8y?6|(6dCD>n16&2z&pRf zx2aa$fe4Ux(BgUxJUW@`pgWxT%P~j9Z{aNp^ypsIG{Z;r}IJ)*BEe5A5N; z!sn6xGH#=7-TUFJxQHL%7=c>8Q;bzqE;K{|L}N(zfXPtmn_gk3XyZPxIb>a4C)NTfUT#-gqvQvQ<1!+-(f<2YV|{ zj1e&2KcbY$kKQmT%G*$@laJp1$iQ)_ELFkGqS@L|<YgNsU`Ota#{`T(kvrqaK+J<_-NcM%{s@JwgNkre4m=dU&?NP~>$jI}y;qmQ!^wN29Qocbv{i1ol za|{rXgpw_eA)H&-f!3JqV06i#cyQe$$q(S{xyWRF4q_778Bfv|ZB^09zRWvMtUbxE z`;S(*$$T7Nbx7@iisiojD%+ILb^rQ4&Rs-g(EmP8K*NCTgWpYVZ@SJ?k??1$0u~CO zUe?unwhgzNTHH_|qM3FxeO*jvM+Xq--qLF55izF89OCP>+`RU}drRPeycq{g}6ZLTdp^lUOXbI)J$wu^E{k0bYt*)+?l?_ zV)*mej~5^^^RJ2Z-i@RVX;|#Gr#Jf~KpMPW-I=LH*k}4Xd(A38Ga&l5blpFH@*rGU z`QO~1m;)2@I08J3w(T%zXX6MQc^O|-b{|`Gl=HtIb+6M97NPcqr}3gtz1H%|pXrm$ zSLKxQ=rEC}?eiPylD-aJ;z?$+>&)Rk-hSjfdPsBE7XKF70yC2ud7Q7W5Wb&V&qCUJ zt-e0j{&A=)@LRr*G<`s8?N~G9D7{rb^`yu9z1`#i<-hCp#u6Cv0^SuD(|vgO7&tWq zI?_ZJBkj7z&(DP+^)8&UZ5zpt{(|zHO%t9E8KM^7t8qt3RDSx z8pd6;b%}j(xu4fJpAhq_INAhEWm>rc9{seDz8}h2s0|QCF34LfuKmq-Zx1Z=ZaQAB zzvDkTSYI7Wd>(cK0_J9J^nl;pzCYN98UhyW>5ZlN1e zS()0NdJ>n-pej&jG`;{zg>PQyn7X-DVPIcc)jd0$wlM z%VgCjIaGC7)|#2l{wojC^CG*F0T({ORGDqJPqY5mX;;231Rdx3IwX2OAKDjDQyM)9 zwQs~8U(pe}TpJSUeLr(1(36|HAFq{PP$KJ1?-b1^45uFj7hxGq*4HU74DfnLTP^+_ z4jNL6h|1q4eZDV}mr+LMtIb2`>)##kcOU)_4-55(`8L_<&+fN|UKbSxe(60VAE{CS zeBb*;v-JJ}Zf15PGFyFR3{3d&*E-){9fi<8p3Cz`~sDdnIRt z^QDJraZ0?-X>Q6ZZ@+1|j`8|Uibvj97d_Mo;%$7B+0_e7hdldTs8X#PgQ``PN3Z5b z|C}3(bGNP4ip{+nRzEu5{H60RHbq`>J4W)KgMppSSMev#@NNztGxRu z|G|fGj(x}tgns>@PsHLyregT{Gk77~+=W$Y6RpuDeAPxSl~AxQenLguFA>x$-~}-9 z@yG9R*?;|hW{zeuO>I?7&>}>ymBZLag*E&~6=e*MQgZG*AJy+p)T7-%I|zQE2!;zY zsqau+k4B#slTl*8N-cEh?Xl~u(< zo679{Gh!$-o)~geu3WKRVv9Rc4XM80Svq{18mpQ-%`pYs!ps`FjEx1S8+%h})%XO40o2ofJnXJ$iW%QcFi@i zr~%=p1n)2>D#f**h+{A%00Rm2<^glB1WrH4Tut8J@0(f0>jC0&75WJ|xdL((v?X3^ z{?CcKc`daNf-Q5d_ln#~2RM@A-FTph;#sC*c%Z6!YKrbl z9g%N7TiM`b;?b!{O>?s*!x*-g!si!>P4mDm72cFX`Z@kSlkZZt3yUi9>|8RaZP}>( zKJ#u>y{gXFUE$WUl63r946~k$L(=Nd&Zky|*1j??RmZnnRp@M8xfkzQM(Aho$PP=p zn1ltFDOPq%Z{2b)XF6LsX>o5pd|uYk{;(aw0};4{|2u76sD2$Y=2gkBmE#mcQ95_) z+H-~;&GHpi>D`Q%NI>cu?s8AIc#=}K@fxq~ z47#4Q6zR1}-Eh^*cB+mudt{e#@JoFM5uHWffO4{$M$NL9BF>^!%c}V>PWky66WY)z z$RQS)n`E_Bq?zj6KzWj;i^bDMB6;69s2$AVS=XaWud9=t7p7T}vFFsRxz7bQmm?;} z3HykTFw1@lp#{-!%TYON6{;rf!hYE|YdO#tHzZ21t+kY}!$Ew)z)K63DvJu+enUEBDGx@rHZC&m%Gjpa{p6u%txS+hE%@nU5J`< zV^gx^TpHIO^3OV;*{w|-w?gq$KCHYtj2*eOo(;u*I#8sxr0vA|d?|UlH?wJjJ_Wig zD@@x-910iaoF5W;$k}e%)XhI#wtvafUpSMmT`TLSR)_r+`}}xmr>A{R^&6=cWtX zQ`J_U*1UCbGHMp109xY3d_tf<>Ab)daZot&_Fy-mvD?iG@ef-RSt`B{zZY%e8YDQr z4{}HoU{YPxs!mV3@t0Ac)G0F?A2S%k#guVmg5yw_ zMOB`hjdWJ0=QLy6TuHEtr+L}K%wKbGka!Uig;jdI

    s#TPyq8M^>X7Mww1@A+=4v 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

    af^IQ#h-GDFk5d!QHpEfl3J%KLN+Ciw8Jpyl{ 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 %%%_* Tests ==================================================================== --include_lib("eunit/include/eunit.hrl"). - -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + -endif. % TEST %%%_* Emacs ==================================================================== diff --git a/src/brod_kafka.erl b/src/brod_kafka.erl index 2b7a8f44..924bbd08 100644 --- a/src/brod_kafka.erl +++ b/src/brod_kafka.erl @@ -363,10 +363,10 @@ parse_bytes(Size, Bin0) -> %%%_* Tests ==================================================================== --include_lib("eunit/include/eunit.hrl"). - -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + parse_array_test() -> F = fun(<>) -> {binary_to_list(X), Bin} diff --git a/src/brod_kafka_requests.erl b/src/brod_kafka_requests.erl index 1aeb2640..da4c9c4f 100644 --- a/src/brod_kafka_requests.erl +++ b/src/brod_kafka_requests.erl @@ -101,10 +101,10 @@ get_corr_id(#requests{ corr_id = CorrId }) -> next_corr_id(?MAX_CORR_ID) -> 0; next_corr_id(CorrId) -> CorrId + 1. --include_lib("eunit/include/eunit.hrl"). - -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + next_corr_id_test() -> CorrId = (1 bsl 31) - 1, Req = #requests{corr_id = CorrId}, diff --git a/src/brod_producer_buffer.erl b/src/brod_producer_buffer.erl index 37b5bc5e..4b6efa8f 100644 --- a/src/brod_producer_buffer.erl +++ b/src/brod_producer_buffer.erl @@ -303,10 +303,10 @@ cast(Pid, Msg) -> %%%_* Tests ==================================================================== --include_lib("eunit/include/eunit.hrl"). - -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + cast_test() -> Ref = make_ref(), ok = cast(self(), Ref), diff --git a/src/brod_utils.erl b/src/brod_utils.erl index 596a9655..5e7657ae 100644 --- a/src/brod_utils.erl +++ b/src/brod_utils.erl @@ -79,10 +79,10 @@ shutdown_pid(Pid) -> %%%_* Tests ==================================================================== --include_lib("eunit/include/eunit.hrl"). - -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + -endif. % TEST %%%_* Emacs ====================================================================