├── .gitignore ├── .gitmodules ├── LICENSE ├── MANIFEST.in ├── README.rst ├── VERSION ├── docs ├── Makefile ├── README.md ├── changelog.rst ├── conf.py ├── config_files.rst ├── controls.rst ├── creating_extensions.rst ├── extensions.rst ├── index.rst ├── laurelin_extensions_diagram.svg ├── oid.rst ├── reference.rst ├── reference │ ├── laurelin.extensions.base_schema.rst │ ├── laurelin.extensions.descattrs.rst │ ├── laurelin.extensions.netgroups.rst │ ├── laurelin.extensions.pagedresults.rst │ ├── laurelin.extensions.rst │ ├── laurelin.ldap.base.rst │ ├── laurelin.ldap.config.rst │ ├── laurelin.ldap.exceptions.rst │ ├── laurelin.ldap.ldapobject.rst │ ├── laurelin.ldap.protoutils.rst │ ├── laurelin.ldap.rst │ └── laurelin.rst ├── simple_filters.rst ├── testing_setup.rst └── user_docs.rst ├── extensions-requirements.txt ├── laurelin ├── __init__.py ├── extensions │ ├── __init__.py │ ├── base_schema.py │ ├── descattrs.py │ ├── netgroups.py │ └── pagedresults.py └── ldap │ ├── __init__.py │ ├── attributetype.py │ ├── attrsdict.py │ ├── attrvaluelist.py │ ├── base.py │ ├── config.py │ ├── constants.py │ ├── controls.py │ ├── exceptions.py │ ├── extensible │ ├── __init__.py │ ├── base.py │ ├── laurelin_extensions.py │ ├── ldap_extensions.py │ ├── ldapobject_extensions.py │ ├── registration.py │ └── user_base.py │ ├── filter.py │ ├── ldapobject.py │ ├── modify.py │ ├── net.py │ ├── objectclass.py │ ├── protoutils.py │ ├── rfc4511.py │ ├── rfc4512.py │ ├── rfc4514.py │ ├── rfc4518.py │ ├── rules.py │ ├── schema.py │ ├── utils.py │ └── validation.py ├── requirements.txt ├── scripts ├── build.sh ├── build_pyasn1.sh ├── dist_test │ ├── Dockerfile │ └── run_container.sh ├── generate_extension_properties.py ├── generate_extension_reqs.py ├── integration_test.py ├── rebuild_docs.sh ├── refresh_extensions.sh └── reserve_kwds.py ├── setup.py └── tests ├── __init__.py ├── mock_extension.py ├── mock_ldapsocket.py ├── mock_saslclient.py ├── test_attribuettype.py ├── test_attrsdict.py ├── test_config.py ├── test_controls.py ├── test_extensible.py ├── test_extensions.py ├── test_filter.py ├── test_ldap.py ├── test_ldapobject.py ├── test_ldapuri.py ├── test_misc.py ├── test_modify.py ├── test_net.py ├── test_protoutils.py ├── test_rfc4517.py ├── test_schema.py ├── test_utils.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/.gitignore -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/.gitmodules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/LICENSE -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/MANIFEST.in -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/README.rst -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 2.0.4 2 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/Makefile -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/README.md -------------------------------------------------------------------------------- /docs/changelog.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/changelog.rst -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/conf.py -------------------------------------------------------------------------------- /docs/config_files.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/config_files.rst -------------------------------------------------------------------------------- /docs/controls.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/controls.rst -------------------------------------------------------------------------------- /docs/creating_extensions.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/creating_extensions.rst -------------------------------------------------------------------------------- /docs/extensions.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/extensions.rst -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/index.rst -------------------------------------------------------------------------------- /docs/laurelin_extensions_diagram.svg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/laurelin_extensions_diagram.svg -------------------------------------------------------------------------------- /docs/oid.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/oid.rst -------------------------------------------------------------------------------- /docs/reference.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.extensions.base_schema.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.extensions.base_schema.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.extensions.descattrs.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.extensions.descattrs.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.extensions.netgroups.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.extensions.netgroups.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.extensions.pagedresults.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.extensions.pagedresults.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.extensions.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.extensions.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.base.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.base.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.config.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.config.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.exceptions.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.exceptions.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.ldapobject.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.ldapobject.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.protoutils.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.protoutils.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.ldap.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.ldap.rst -------------------------------------------------------------------------------- /docs/reference/laurelin.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/reference/laurelin.rst -------------------------------------------------------------------------------- /docs/simple_filters.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/simple_filters.rst -------------------------------------------------------------------------------- /docs/testing_setup.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/testing_setup.rst -------------------------------------------------------------------------------- /docs/user_docs.rst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/docs/user_docs.rst -------------------------------------------------------------------------------- /extensions-requirements.txt: -------------------------------------------------------------------------------- 1 | jinja2 2 | -------------------------------------------------------------------------------- /laurelin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/__init__.py -------------------------------------------------------------------------------- /laurelin/extensions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/extensions/__init__.py -------------------------------------------------------------------------------- /laurelin/extensions/base_schema.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/extensions/base_schema.py -------------------------------------------------------------------------------- /laurelin/extensions/descattrs.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/extensions/descattrs.py -------------------------------------------------------------------------------- /laurelin/extensions/netgroups.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/extensions/netgroups.py -------------------------------------------------------------------------------- /laurelin/extensions/pagedresults.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/extensions/pagedresults.py -------------------------------------------------------------------------------- /laurelin/ldap/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/__init__.py -------------------------------------------------------------------------------- /laurelin/ldap/attributetype.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/attributetype.py -------------------------------------------------------------------------------- /laurelin/ldap/attrsdict.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/attrsdict.py -------------------------------------------------------------------------------- /laurelin/ldap/attrvaluelist.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/attrvaluelist.py -------------------------------------------------------------------------------- /laurelin/ldap/base.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/base.py -------------------------------------------------------------------------------- /laurelin/ldap/config.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/config.py -------------------------------------------------------------------------------- /laurelin/ldap/constants.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/constants.py -------------------------------------------------------------------------------- /laurelin/ldap/controls.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/controls.py -------------------------------------------------------------------------------- /laurelin/ldap/exceptions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/exceptions.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/__init__.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/base.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/base.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/laurelin_extensions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/laurelin_extensions.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/ldap_extensions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/ldap_extensions.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/ldapobject_extensions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/ldapobject_extensions.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/registration.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/registration.py -------------------------------------------------------------------------------- /laurelin/ldap/extensible/user_base.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/extensible/user_base.py -------------------------------------------------------------------------------- /laurelin/ldap/filter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/filter.py -------------------------------------------------------------------------------- /laurelin/ldap/ldapobject.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/ldapobject.py -------------------------------------------------------------------------------- /laurelin/ldap/modify.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/modify.py -------------------------------------------------------------------------------- /laurelin/ldap/net.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/net.py -------------------------------------------------------------------------------- /laurelin/ldap/objectclass.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/objectclass.py -------------------------------------------------------------------------------- /laurelin/ldap/protoutils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/protoutils.py -------------------------------------------------------------------------------- /laurelin/ldap/rfc4511.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/rfc4511.py -------------------------------------------------------------------------------- /laurelin/ldap/rfc4512.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/rfc4512.py -------------------------------------------------------------------------------- /laurelin/ldap/rfc4514.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/rfc4514.py -------------------------------------------------------------------------------- /laurelin/ldap/rfc4518.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/rfc4518.py -------------------------------------------------------------------------------- /laurelin/ldap/rules.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/rules.py -------------------------------------------------------------------------------- /laurelin/ldap/schema.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/schema.py -------------------------------------------------------------------------------- /laurelin/ldap/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/utils.py -------------------------------------------------------------------------------- /laurelin/ldap/validation.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/laurelin/ldap/validation.py -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/requirements.txt -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/build.sh -------------------------------------------------------------------------------- /scripts/build_pyasn1.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/build_pyasn1.sh -------------------------------------------------------------------------------- /scripts/dist_test/Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/dist_test/Dockerfile -------------------------------------------------------------------------------- /scripts/dist_test/run_container.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/dist_test/run_container.sh -------------------------------------------------------------------------------- /scripts/generate_extension_properties.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/generate_extension_properties.py -------------------------------------------------------------------------------- /scripts/generate_extension_reqs.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/generate_extension_reqs.py -------------------------------------------------------------------------------- /scripts/integration_test.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/integration_test.py -------------------------------------------------------------------------------- /scripts/rebuild_docs.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/rebuild_docs.sh -------------------------------------------------------------------------------- /scripts/refresh_extensions.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/refresh_extensions.sh -------------------------------------------------------------------------------- /scripts/reserve_kwds.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/scripts/reserve_kwds.py -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/setup.py -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/mock_extension.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/mock_extension.py -------------------------------------------------------------------------------- /tests/mock_ldapsocket.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/mock_ldapsocket.py -------------------------------------------------------------------------------- /tests/mock_saslclient.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/mock_saslclient.py -------------------------------------------------------------------------------- /tests/test_attribuettype.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_attribuettype.py -------------------------------------------------------------------------------- /tests/test_attrsdict.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_attrsdict.py -------------------------------------------------------------------------------- /tests/test_config.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_config.py -------------------------------------------------------------------------------- /tests/test_controls.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_controls.py -------------------------------------------------------------------------------- /tests/test_extensible.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_extensible.py -------------------------------------------------------------------------------- /tests/test_extensions.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_extensions.py -------------------------------------------------------------------------------- /tests/test_filter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_filter.py -------------------------------------------------------------------------------- /tests/test_ldap.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_ldap.py -------------------------------------------------------------------------------- /tests/test_ldapobject.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_ldapobject.py -------------------------------------------------------------------------------- /tests/test_ldapuri.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_ldapuri.py -------------------------------------------------------------------------------- /tests/test_misc.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_misc.py -------------------------------------------------------------------------------- /tests/test_modify.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_modify.py -------------------------------------------------------------------------------- /tests/test_net.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_net.py -------------------------------------------------------------------------------- /tests/test_protoutils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_protoutils.py -------------------------------------------------------------------------------- /tests/test_rfc4517.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_rfc4517.py -------------------------------------------------------------------------------- /tests/test_schema.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_schema.py -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/test_utils.py -------------------------------------------------------------------------------- /tests/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashafer01/laurelin/HEAD/tests/utils.py --------------------------------------------------------------------------------