From 474f67f05052ce2d984769174dbf1ca43855dcde Mon Sep 17 00:00:00 2001
From: Corey Sotiropoulos
Date: Sun, 6 Apr 2025 08:18:07 -0400
Subject: [PATCH] Containerize server
- Multi-stage build to reduce container sizes.
- Separate services for each executable.
- Separate database service with volume and secure password generation.
- Common configs for LSB services defined in extension field with YAML anchor.
- dbtool service that waits on the database and runs before all other LSB services, making sure the database is up to date.
- Bind mounting for live edits.
- HTTP API server enabled.
---
.dockerignore | 8 +
.env | 0
Dockerfile | 62 ++++
LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++
README.md | 54 ++++
docker-compose.yml | 106 +++++++
entrypoint.sh | 8 +
lsd_logo.png | Bin 0 -> 369147 bytes
lsd_logo_circle.png | Bin 0 -> 181263 bytes
mariadb-entrypoint.sh | 34 +++
10 files changed, 946 insertions(+)
create mode 100644 .dockerignore
create mode 100644 .env
create mode 100644 Dockerfile
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 docker-compose.yml
create mode 100755 entrypoint.sh
create mode 100644 lsd_logo.png
create mode 100644 lsd_logo_circle.png
create mode 100755 mariadb-entrypoint.sh
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..74c5ccd
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+server/build
+server/documentation
+server/log
+server/losmeshes
+server/navmeshes
+server/scripts
+server/settings
+server/sql
diff --git a/.env b/.env
new file mode 100644
index 0000000..e69de29
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..638f3a9
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,62 @@
+##############
+# Base stage #
+##############
+FROM ubuntu:latest AS base
+ENV DEBIAN_FRONTEND=noninteractive
+RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
+ echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
+ > /etc/apt/apt.conf.d/keep-cache
+
+###############
+# Build stage #
+###############
+FROM base AS build
+
+# Install build exclusive dependencies.
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ apt update && apt install -yqq --no-install-recommends \
+ binutils-dev build-essential cmake git python3 python3-dev python3-pip \
+ software-properties-common libluajit-5.1-dev libmariadb-dev-compat \
+ libssl-dev libzmq3-dev zlib1g-dev
+
+# Install Python dependencies as user to facilitate copying to runtime image.
+RUN --mount=type=bind,source=./server/tools/requirements.txt,target=/tmp/requirements.txt \
+ --mount=type=cache,target=/root/.cache/pip \
+ pip3 install --break-system-packages --user --requirement /tmp/requirements.txt
+
+# LSB requires Git for the build, and emits version.cpp along with the executables.
+# The bind mounted server directory does not persist changes, so copy these from/to
+# the cached build folder, preserving timestamps to avoid unnecessary rebuilds.
+# Then make a copy of the executables that can be passed to the runtime stage.
+RUN --mount=type=cache,target=/build \
+ --mount=type=bind,source=./.git,target=/.git \
+ --mount=type=bind,source=./server,target=/server,rw \
+ cp -p /build/version.cpp /server/src/common 2> /dev/null || true && \
+ cp -p /build/xi_* /server 2> /dev/null || true && \
+ cmake -S /server -B /build -DCMAKE_BUILD_TYPE=Release && \
+ cmake --build /build -j$(nproc) && \
+ cp -p /server/src/common/version.cpp /build && \
+ cp -p /server/xi_* /build && \
+ cp /server/xi_* /root
+
+#################
+# Runtime stage #
+#################
+FROM base AS service
+
+# Install runtime dependencies.
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ apt update && apt install -yqq --no-install-recommends \
+ binutils git libluajit-5.1-2 libssl3t64 libzmq5 mariadb-client \
+ python3 zlib1g \
+ && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /server
+RUN git config --global --add safe.directory /server
+
+# Copy installed Python dependencies and built executables from build stage.
+COPY --from=build /root/.local /root/.local
+COPY --from=build /root/xi_* /server
+COPY entrypoint.sh /entrypoint.sh
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e72bfdd
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ef00838
--- /dev/null
+++ b/README.md
@@ -0,0 +1,54 @@
+
+
+
LSB Server - Docker
+
+
+Containerized version of LandSandBoat server emulator.
+
+Pre-configured build and runtime environments for a fast and easy install. Supports live editing on the host machine for a seamless experience.
+
+## Usage
+
+`docker compose up --build --detach`
+
+That's it! All the setup is handled for you. Check out the [official LSB documentation](https://github.com/LandSandBoat/server/wiki/Post-Install-Guide) for more information. Some adjustments will need to be made while working with [Docker](https://docs.docker.com/reference/). LSD specific information will be added here over time.
+
+----
+
+- `docker compose stop` / `docker compose start`
+ - Use these to stop/start the server when rebuilding isn't necessary.
+
+- `docker compose build`
+ - Builds the image. With caching, this basically means rebuild the executables.
+
+- `docker compose down`
+ - Shuts down and deletes the containers.
+
+----
+
+## Notes
+
+- If using WSL with Windows, make sure [the project is stored in the WSL file system](https://learn.microsoft.com/en-us/windows/wsl/filesystems#file-storage-and-performance-across-file-systems) for best performance.
+- To facilitate automatically generating secure database passwords and simplify the setup process, the `.env` file is intentionally empty and untracked by Git.
+ - **Optional** - You can manually populate this _before_ building the containers with these variables:
+ ```
+ MARIADB_DATABASE=
+ MARIADB_USER=
+ MARIADB_PASSWORD=
+ MARIADB_ROOT_PASSWORD=
+ XI_NETWORK_ENABLE_HTTP=
+ ```
+ Otherwise, the default user is `xiadmin`, the default database is `xidb`, and both passwords are randomly generated.
+ - The LSB HTTP API is enabled by default and can be accessed at http://localhost:8088/.
+ - This can be disabled by setting `XI_NETWORK_ENABLE_HTTP=0`
+ - Because environment variables are used, the server settings `SQL_LOGIN`, `SQL_PASSWORD`, `SQL_DATABASE`, and `ENABLE_HTTP` (located in network.lua) are not used.
+- Because LSB uses Git during the build and update process, changes to the Git metadata will trigger an image rebuild, but with caching this shouldn't be significant.
+
+----
+
+
+
+
DO NOT OPEN ISSUES/DISCUSSIONS RELATED TO DOCKER ON THE LSB GITHUB!
+
+
+----
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..c3ac205
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,106 @@
+x-common: &common # Configs used by more than one service.
+ image: lsd_service
+ pull_policy: never
+ env_file: .env # Automatically generated by MariaDB service entrypoint.
+ entrypoint: ["/entrypoint.sh"] # Copies the MariaDB env vars into corresponding LSB settings.
+ environment:
+ XI_NETWORK_HTTP_HOST: 0.0.0.0
+ XI_NETWORK_ZMQ_IP: world
+ XI_NETWORK_SQL_HOST: database
+ volumes: # YAML merge can't be used with sequences, so bind everything here. (SEE NOTE ABOUT WSL IN README!)
+ - ./.git:/.git # Since LSB is a submodule, we want to preserve
+ - ./server/.git:/server/.git # the directory structure inside the container.
+ - ./server/log:/server/log
+ - ./server/losmeshes:/server/losmeshes
+ - ./server/modules:/server/modules
+ - ./server/navmeshes:/server/navmeshes
+ - ./server/res:/server/res
+ - ./server/scripts:/server/scripts
+ - ./server/settings:/server/settings
+ - ./server/sql:/server/sql
+ - ./server/tools:/server/tools
+
+services:
+ database:
+ image: mariadb
+ entrypoint: ["/mariadb-entrypoint.sh"]
+ restart: always
+ volumes:
+ - ./.env:/env/.env
+ - ./mariadb-entrypoint.sh:/mariadb-entrypoint.sh # Custom entrypoint to generate .env.
+ - ./server/sql:/docker-entrypoint-initdb.d # Initializes the database.
+ - database:/var/lib/mysql
+ healthcheck:
+ test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
+ start_period: 3m # First time initialization takes a while, so give it extra time.
+ interval: 15s # TODO: use dbtool setup, set lower healthcheck.
+ timeout: 5s
+ retries: 4
+
+ dbtool:
+ <<: *common # Import common configs.
+ build: . # This service builds the image shared by all LSB services.
+ command: ["python3", "/server/tools/dbtool.py", "update"]
+ restart: no
+ depends_on:
+ database:
+ condition: service_healthy
+
+ connect:
+ <<: *common
+ command: ["/server/xi_connect"]
+ restart: unless-stopped
+ ports:
+ - "54001:54001"
+ - "54230:54230"
+ - "54231:54231"
+ depends_on:
+ database:
+ condition: service_healthy
+ restart: true
+ dbtool:
+ condition: service_completed_successfully
+
+ search:
+ <<: *common
+ command: ["/server/xi_search"]
+ restart: unless-stopped
+ ports:
+ - "54002:54002"
+ depends_on:
+ database:
+ condition: service_healthy
+ restart: true
+ dbtool:
+ condition: service_completed_successfully
+
+ world:
+ <<: *common
+ command: ["/server/xi_world"]
+ restart: unless-stopped
+ ports:
+ - "8088:8088"
+ depends_on:
+ database:
+ condition: service_healthy
+ restart: true
+ dbtool:
+ condition: service_completed_successfully
+
+ map:
+ <<: *common
+ command: ["/server/xi_map"]
+ restart: unless-stopped
+ ports:
+ - "54230:54230/udp"
+ depends_on:
+ database:
+ condition: service_healthy
+ restart: true
+ dbtool:
+ condition: service_completed_successfully
+ world:
+ condition: service_started
+
+volumes:
+ database:
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 0000000..1e1949b
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# Export XI_ variables from corresponding MARIADB_ variables.
+export XI_NETWORK_SQL_DATABASE=$MARIADB_DATABASE
+export XI_NETWORK_SQL_LOGIN=$MARIADB_USER
+export XI_NETWORK_SQL_PASSWORD=$MARIADB_PASSWORD
+
+exec "$@"
diff --git a/lsd_logo.png b/lsd_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..2df4f7dac3182cd976079604118bd6128b8589fb
GIT binary patch
literal 369147
zcmV(@K-RyBP)u94BQ_K}6BLOSCZ85Ukry+PISn3D6EzbzbQm^JM^~3{6*L%7
zqE`(W7!{!$urX5?QWuObB_%E!HL%4F8`2O&6;Owj6HrY|Do8U+7G8-o6ISmLM062S
z7DKgk3>euD9v5Dt5=UziSZWoXF%yYk8Bo6zh^8D!OBY_f7JI=-Yb-}2uSac|6^n%x
zjKV@3kT@o17pa)(4Hy+{!5evZ9yrt(sc02zs1|sr87IDI9+%U59d1=9>ZKWMCtMg=
zNEL04)hHZCL9(_IQgAgT6rRA-KqBuw9FGk)STB1OnuM@wBKQy+bQN{13>HB6>{+?8SZ8t6nl_yR+-KdYO{PH7MNS_dm3gxkruYOkqZ_Sn5I2lY97ZkP%R^0
zV`CQo9Iq5@NLt3wkQY#NWlv07jVp9?ZkLjI
zChn0K&nrqthAbAkkc%KAZfqy7MJE<^UeIS4vsWTA6LpP3YKTNA9?WkS$=4NUU6xRj
z>=A3_x)&SGr-~bsk7gupJGmt}DK8IK%Z+8k;^t|?5c
zIgmtg$CFhf9eN-`oGs88jv9^Mbt1d5k|2U`VWDf9ZGs^R9)>pTk27gZfwaHw&SZ&Visy4MVoBVW=W~NCPIeAUa}{l
zAFr7^vqhSvq*lXFCDYt)k5NO|Y=u{=dS{%5t;!y>?NC#7n_X$fIbX41!a2o_hiw_*
z)y#WZZiCbAVq|rmmQ}TyALNtmcUl_ZM4@rfMVr;{9K7CC#>|pS?K#8jj8m_aaM_ES
zo~&i!(jeTdXWDVYd7RRXKHHih*<-rUu%xu3*EpBTkz3zJIM9t{001BWNkll?H*N<8cb{e?K8Tz8!Ptg29D#trqsfwkjhTci$vd*J@^F4!VXFl0ta5Xwqd9uZzW<
z_4S2?jfIVkjW564$!gv_-2c|*t`kqi$j
zh9#0Z$yg*Jw_p<%uCS+D#OoOt81qE;2m*_-G0K%r?Ch*35`Rx55(^-L^MC#}xZqC)
z(-1?uoErOL2tr8GmPVu~D&VxV2o(;8WN$y0`-{80yrN>XECQ+-9UQzh>MQ4od_w|(
zAQF*!9AdGEBkGij9sR_#1p_O|FeD5so0UrK$cR$eaPgwwf5m2N029p(&9Fahvmvwm
z`VtO@BjwcB3%r6pV{L6;W8cuw`SUkUm45V5X+>%2nbRMhK2>s}1R?c$ZBx^F6Rg&|
zNPQNMVVv4_oQU1T-MI1FcyJ@e2a%G=Qj0P#AJUMN5kZ2+J^`_pk)xX!fm0NT%o>e-
z^L+w0i+ZBbLZM(l&E`FVkA*QdjA59WAOv_eZp=}!O%9aHu@fvIFuHw%)ftb+D;01!
zEW4de1lQN$=4NdJthFKWxZ6UYmuF@!OF9ZmHC^UcQ&YO#-D2@IXfvR02XOcCM%MFnT$`((sY34+rw6uE5|?(WM8z?lMLPK
zoC2X!s~6O2m0k}nX%h+bLsArzPOFkOhIEkt^&D&A%Ecm4_qk8bl~&eRU^74PS_pO0RYrske)*e58QIHHvIp909KR7vnAts2&oX)=vtg!E)Pmj!kta3c_Oj9Y&`6bhxb
zQd^-q!=fD_Rmm#jIvk`{Gf&4YmJBempg%oZ>mHhzCP39=9w5=efkNW&NC0@zl+|kI
z16>k0dC2TT2u(XpuY)%yV)0;nUXG#zKvO7KPJ+!9Vdc6~IRd2QpPfZ=v*=CF<<^>-
z)m
z>C!MRlk;}WBIlw)q3}ZW*Pm3BS5%jm3&mUc)l@!JSF<#C@TbgE`LjC{6GUtq;P#gN
zO^l%flf6fQYj^LjNeUkM&)-{CR?e>swYT$lB2HyxX<17**D`VIUr(O=@WaN!PGWx(LtzNpsfce6~6%obH?AeiI&fu26^?RBPuK^s*MG|Y0lyL-eQN52`v#l*C)
z45+7UsBvg;`uDf~Isd6o#I0zL_~Zj3v8bDedK?aqqF*}J*=Y_#c8JlK)aqkWwCf{U
zC48Kyz+M0={Yf~fhDkEbXb_5acs$bjRI2{Hsw)?N`+iAdV@czs8#hjrj#eBS9dNpm
zk~Eq0Hy=N)bI~pc#iXK>C%F+k=f*#ng;os)iD9eX5Xy)0sl35Z2LM=PO!{Ijs8Sax
z1j~pAeu<{+Og5WyR|(qPKqVsHz(CJgMaNfPC@yzh?u-^*>^*p}wwRI?qIc<+doPcy
zG|gysgYGy*28}E}J&_q72YTZ1DzWY5gjPGE1c%m-AP6fZ%&Xv&b9F!dSksz+{P_O0
zYu7;&O?tgfuPg4Fb`KACHFWH!ckdp_D?ht;lX9AN!~NfUb9TI=fSqgWIXi5S65c3q
z=uoJz3RtYI*zjuB5fKuCA_iX0Ge%ufO~?W4VJp{q^8r(*o$k!o(Zv|41(X
zpd|A=j<@M;vo>qwonf=YQr#UOL6V4`EHFy)Scof6E!+tlXeY&pt2Bv#X^337IM->G
z+OaKSD?-%xoZN{+&H4lAT$0OjuZ6PGv+LJ%m$l7KJ3Di8AG*(<&&)IP%=dYHU+?!v
z@FKi0)aG_OiyQ`1_h`xQOG>0w(p?vdDVgaRSv``-zqSvTLCMEWBP1$`M{ziuR-x4iqUA6WOs^%Ur&;_q3d&Q0D*t~CsV+|y
zp@9=qdU3s8B0A&bXTR2*tAIwj#W%yaQg*`TTheC~DTipQjxnU-k;@#BFq45HiE
zUDkbPnxr66$P@~q)QPWs1Bc^SFNVeXdDO(h6b0v
zNUy7?s5?|t_t;8o0R;}w5IG7Zilg7*6;F)Bo>PW
zVu41nSpL>@t#W?^ZQ%2Z)g7|9Td0q=PA#vt44T)>USwyT?HYA&sTCKNIl`59!y*B1~60u$%|GZ7r0INz_t@%cOw0U?nz
zm_2w6g7rXk<&=FXsyRJIn{@-N*}&Z4!`W{95R>RNqwslygJ!SSn@D)D$mC>qKK;ix
zbA2-HYN_hGxidG;oRR9ZqzZaLK|$tv4bVno$v8BttYG)0zUevyq4W8Of{(})90!NN
zAX=E;L;z}C`Zec;qn%5@3yM6l>5Z7DMzwbiv#$8!?
zv<{6%W6*j;k+?h_jYmAAqy80dTevM8
z_Ku9eSG}xhO_?6_Ru9TaF$cueFGXW9467O)#k8IkgQW+HN29m9F+0@D$cvGlQb>fj
zODA##MokZ)6p~279L9R1(FkF`kzEK1%4Gl0TXOSeRpGvG_enSIK9F=bcz4uXCdgi)RCoHelPhmQu*1w5Bp-?yZMMUChAqxa&m2`2rczjdS
zlP)#D!=kaQ;GAqXQ{+;ip=jXv(!l4F<1LAi7odJmB)Sv~P6o$~CylkrDy33MxRFP%
zU`gs&EO@y{!r^eN9E6JS2s|FH?_?nMx$)q{+Qj(e+RamnyH55$NE%x#X?S64@qk#6H?P9l*+?Gbz&EC^{sWt-^n`5LrvW!KQA&eXf
zRl!mZdBaSmw`b(2N~HqX+3Yr#3&H_nT@NdNy%;+F)Ct(RIzshmPmj}KV4lv|l=F+<
zee%m4AMD)x{<`&rV7jeo>Fdf<#8rx8P|W;3s2QaEsxnMVoTXivrNPg}L+c)6Nm#5?
z?Gm7d#evm*s9`L@6udH{ORzN_|MOSDBSep<=Ov21jQ>k4UOIk!|D>_3R@q%^die0t
zoM|!jx&+>)^Xnu<2$_KJ$a%ah+=uo+W8=2rwdLX84zGQ4iO%EG5h{U7(P6=*sS`U6
zR8|TaLmus{g!VrY%mygQJdfkGFVh5jg50p>M)>TG9U!70j~fFAY_dsAIth0tcO7hu
z9vE{P)G3H31gxj7>>5hCu32g&LfAlY>H4x8D3)2~TsQ@_PBL^>>vg2HxAjAKUe-t1eVIy+vQBc8?U)ak2vJKA6D;_
zED#tjB3uV;2PgpdGNTwb4-6mP$50y{nWAx3`~fA3nq7zJbj-NmzXO{K50*Cq`#%
zGq7}XSDT$+tA!uS>aEiQs(zJ9rC0e4enT{raL1ER=bY>D^?2(0R3sixC1DlXl7)?h
zA2$~E$v~`~Ng#{h+*R2BzWGMkd|Vp{?63FK4>}W~cmNtUGGsD5^glHCltV*Gx3($}
z3>r9UMu8Y1V9H#jC%!mwVsH8Tf5T>M&C1Ej`t?1DM3P@F$$_WYGh8M^Ek_ta1fhs|
zbhCLQbDnx<{ot`$m;|Ch82na99_VqitpvCZWFH*V*4!roCa|)Ww3*vG4j=y0JHOiT
z-p=&5wrtt7`E~4@oBppJjZIY|6CRs}L8z{(fTm+g)juJ%pSsDK$kiYe0w#|jRz%w@
z77J=eQGiOG-$3@81HsXThHDL@qfN^4rly&hm5a?a33p-hv9mz@`)uLZQ;2*;I7>#_K8zM_pXO;Y4W$ZEP|YeSC{wq+LlQBJpHu
z5EfYHcX3(aTJpt9Wyb8{o;&||HO!@8DCf8}tN(uf?Ae8p&e8c~Ts9xbuZKqUHDZN@{M`;SNLLLgc<3karJCTS7)>FyIJYXD5{#y8j+Cv^Q_=U*IGWe?8
zF@KC~mBAa`@wg0Pc}P}RU+*TnGkuZB++29&mh^GdXw4!>hVca0cLsuxxZI8Np_>QHX0vC~Lx%YZ
zSUKtObWcnGmHbb_Y$YW}_wD;LblqVxiwp{6C9~XBnYiugyMFi1jsw3x{>$`Vy!+Y8S5+T5w}`G%p+$6q(a1*9vN8xw0>Aug)
zMhb*XCP6@=h}lZWX`wliV+x7>HJUMD<
zQ`6K6sh!SmrStVIDq{Z>9l%mfQwvE1CKb2awO7Y3;4UtAd99P5%{!Ef`T2`(1as~a
z&;+@nfWi=BNoQtFY&I33jNmFS_vsow5BBN;2&G``9Qa1X4TYSlAyFuZw55eu+44j$
zrSs`L9d188?8jNV=Cl;&vmP%F4
zM<063&<3Y&x#M6$^J|A>gWZXBcUbFA&IOh1AEnV~h|N~6E-x?F)tL-_LGi_6MFEq9
z!IrhZ`oo^{clPAx=WosG$;%_;5q7(vurG21_=M;84|qJ2wzjNVco6+JJZv59Y}xc?RR%W
z@W2guh+1`A-s$(jbhN@99O+(H#wjzX{jGnyBuCmfCTa1Qky)+c&@ldr|
zZf`}PFtnW`7p{B_UDxaLYoOI4$#u8W*=@DP10uIpD{_i5%Nov+c^!2-uQiO@#v2-RnLeYuRn7~6
z35cbrf(KD6n#jJ{ilRK8nxPPosCW#aG_%xkL~=5({d%XjdvIo^;c}hCn^0mXV`J(H
zDasft77z&dRW^+#WaeR&L0zz9X1wH^lJQ`jvYg{ar_c?px&Xw+&oOR;d+uo8a!=x%cUpC1F;|FyRE
zSa(7jfXnZNa+XjtTqC*jV7Z+@VV)af&MrTD@Wqi6S1xzi(&z
z>Y~;Pbu6G89UZxT{mYTg)u=+jgnprj#R@eFQyb##cE^^M22?7z;86}*%-{jCfYohG
z0Y04%2fZp+V{}_tns_7;i^UT07j7+pc3?dm2>%d@vLRo~&qlhsniit!ixnv2lVTDj
zBSQkPxx4iBtgk-!;O{576lNNUg5?sju#%eLS#cB*%W=7K5`!vW$mJnT%wS-d2Z$Rt
zA+|v=v&gKDssD0l{y|CRc^tpnx@*GJCwB5`Bca9%3?IM+S5HnDkC8`04cmsNA5bnV
zj7+%ZEIq)kc1kYHNVBB|oj;&oF2oN96a&*)#1@e{ohD;CH67(Ny~c9dZ04HT`{Ta!
z{KY>He>~6o`+mRPpU*S;@FDM-X-o)U?qi`y4F<3Agg1q?+P#?+V%d(Y1INDp^i$w-
zAYH#aTzk88EwA0yFR~GFe<|m5IL)S!ddJYV6*i#nHSn8Cw{(W~!WCI(W}q
z`MjJuQ!*EaBwoqLg?kf`GzwuM=GmggPj?01q`F?^=BWLcDtsSoSPeYrlqxk
zrb8fc7>oi21C%O6ks35s8-UuVY@bS+FoSC7FzVMZywZOubChFv3;*@7>w;usA00Uk=cc=7aV*PG#RY~V)2@mABd=4N%RkVb6-fvWiJ
z!?>zeo!Vbb27@+B(BjlfAyAU(3@!r0>}N}$2lAV4)ukprEH;7^0347g3yTw0(3s?lqZ0!qM~6a7<|;k%4lNObVJS;SvbBD3`-QBPcE3cLY%N
zk-8(d_uT%|QhrktkX^Q^1vJ=}u^Tr)#F|=#!d4THrzLjKXvE#S(t+l_KDK*D7LZ(d
z`RT`MDHFGyLh2+618QPtE(yE>iJ^|qXQN~eKBqfv+ZU%w)oPj4FH~!rc@AE7kAdBW
zvRDcUg^em@x^OH|*)r#tt)m(udgt8bGhhAf`|rWxiKm|c3SW@zYc
zF`ZMKhfDLuz2ZzZVY_*9^5a6aD)jfUh4YoMUWoIcfK^oEd%w228eg@)X41R!?3$c?
zIXD6t=#7jgp{Y5Zyhwtw<*bNOuTRWu>Wm&oG+=Z(oYK@r&$oD{VS4(^tLa}~9et9(+0{L!;1
zk4HEWa)T@Eb`OVo!|vfpolPW2voj&`Tw#OQ|F{J+{;v|9LaKDBWQ-~6fyna_I=y%d1O3?@kHqYkAXlaES=e4k_lWEzl{c-eFcILIGhYbqExCz
z4Ly4<)Ll4IQ_@pYhw(c)dPYIKnuMmYk&zoCm185IMhJPrY}(!q8nHe-{lLkSe+CsI
z{db2yJKg9vN@>P2Tz@_>2{mV+Sz6v_*b4I
z`(8eV8E7EfQD!8fl39bnP-VcQO^G5hjyYC7t}ZWL{Hb|rYSy=gsZx
zP%#~k7qlln7gGr0|4xQ_8>^~fjj`~z!$%tzs=_viz)@VHmgFbrKfM0%+w1<{%wMCx3o^LY$e~#
zIaEvuHxA*rbd7jpbMq|-$@^guzM=wFkf21D?L^o8D~Ap>p8PB}VGKN08$F$w2pLW(
zdQnv$mG6dM$27Rp9Z1P3wgko^f0z?D3i001BWNklNbHme($dHTAS))5P&|a+o&hq%>m@K45>^MF
z56lQuEe;tXku{JCYr1u754DGy`Ub&3rSdx-cJQ->LLslVc4Ta%yu7ld<#J2w&DxI4
zy+n1{j`ZCJj_vv*2-d@Y`SNhU;{uA?TPv)u&yscGaR`-KRLy@_gK~h${{9a?ocbm>
zY#R)zwaU?Z&6sMmrzf?#pG|6gQ)n(zsboT;#MR-DQO}H2msHF95lF9!zMB3DV9l&A
z*#=HxWPIE|=XW}FGQGNX
z^?}}AU~{p6TI&bCisjGdkIwcOQp4NSyi{f$bh{@v&0en;BD;2cvP&nhcMlDDm(3pC
zq$M!jdM4_D;@v+FT_4H=NR{Xl;5gFF;ne3Uv5++})Aiy_S63`Hu-__RNZ2(cdzw^h
z0I|`c2=`G%|D*o?M_dj9BZxdT4Urc`BAnu!xLIcbr{${67Hyq2>Ge`Q(>HZtX^HoL
z4$VKPiS!QRH)^E?C2QL87Xfm?GhhgiZgNCYV2}Y!AT&WIQICx=92qi#k&|u`XF&)|
z^jJm=G4X(G?4gqw!O1VnrdUHbBhVCwF)$LUjB@_K&fTE(Zm#9}Pv6}By??y#?DKt|
z&-1?9-4ppRl~V-_ksW5kbjR%2;`;hJV6ye~r|+%vcN!YmFycBo?hp1c()J$vwR
zvx(Na^4%25rp(N(+p^NPZ`}?gcjO==2oR5wsm)BXpDX(mrftqsu9XUa;^?JUlP!fZ
z$xeUJuWv@wy~8LdNR=#>(%7P$TlwI;wX(K=suPC}fLQ#5$ra`nckmn8^E5gPYrH29
z9XeE3_b#sFH`IhtwMK&=2<-95N4?eFXf$fYVMmG#!ChV}P6V~sVfzjjj<}-8e38u7
zUv@L=w{{9=2`ebI6v6!`M
z*Vj{O4F~Oo>jB;U_3vLMPTfFO0gFqNJx6NW(#DH^;_3MK8Qc_&ct>>*jJ}a}v}By`
z`B&ZYRG2Hs=>#B{<{`;otjvb*)TSpe
zZ#tyaIOB0NzWnm#`Q_z=+_ZtfvuDpRyImU$5--+cj#p4-vq}QpxO)S_T?P=|UQOpI
zjI37E^Y8B2H#F9NTv+75LqR|J8W-Nb|A*fQ+k{}&&)7kBshIUFxtyzP_pG#Yh6QX|
z3GW7vSCe>ncN%KuVYrQ&yKijcXJCut!P|C{eBx581>s6h{A_XiS3h;PzUy4zOS#~S
zNIl^kXz|HRXl5obGh+pv#=O|(XlSf2g={9h_L}d+!M)fq(YZ7I{bfWJz-D^=<;#u#
zYp*)P0s_92pbJgl(zW_3~b$@g8SN
z2MNt%W}$2rh753?4${GHbvBKeOrtUBG|MJX7&4mz(-$TttGl|y)mNG_@+g^>!mZoS
zWo_LKB*#cEvi&-N~O;@3qID8>=ATwC0}&wS;%sU{qe_*W4-Km6n#W7trgE{@vZ(eZAAe
zZM;)+gPH=#AbO%-btuCIua$fln|%dCAOa9Q<|FM?Z5_q66MEDv?0>Lq%5&-XC0%C+M8!
z%IVs!QFV6y(*1p9Wh$r$AsM8VM5wt#`9t^bFTGm2*y
z4iK)S=tc>%q=Z+)11-hD1igKB<1wgul
zyg(%cU}Qkir%m-s
zXa-;tu!|UdBQI`33kzZX*CotEu(Z`$1yz$PXVm;Yc2GSms5
zOWK;H*pUPzC(>Iex{KN!_G{@jTM9LqDQyY!)>>HHf~&ckKmJr@s!)5L7q_$=m}^H-
zDLYZdJGg@4j?{8&T-#E>OTB9auT0z!`&RMTM@B>lLZNgVU5sJthM-t`)9_Ef}mT
z(r%0N)*1{|1A>aRdv>{?Yh4=shHw|k8t8Z4-OkA=iaafYODytsE^sgyZ!wuEAJhP^LtC%sNmMnoT$rSC^djNDE{o%!y$>h^XQ-5
zIg+kC?sMU#TE6gnEPQ-YJwDm{?CTsqs0t7spG*LEQYuiLG1NRf{Hw$n=ux%0x3_m}
zw7q?@z4>Zc@meHYHZ>KoG@dE{-Ebmhizh4-<-?Pcm#}WrGs3?nsPxB7i7E4GVTUn%i
zRT@oa!Qc`K2}o3x)Xu$8^h1pu#44GTf@85DFG|9Z$cfJ-N~KaIr2^UE33&tq=&ofG
zZTA{2mQo5OnLtQQ%Be_Ay6Q1!B%4zA@Ar7j=Dw;l94xgj$oN7gBD%#&OG!cDJdDdn
zut1R&IKdDY+ZH~*7R0B}dAau0`UYUuY|J#!FF)yixN4MygE!6|IG|8yg}}+IirN;w
zF1S0pxzbv=zJ(};I3ye%M-nj*;knns02Z_bBOy1?9FgkXalx_K&C<3jS5BWlUAX)o
z5n5obwn@Tk#f@dy2L?aY~$zkr%#u^i6eltKnsla&(21g4d0Kwf3l;i?lQs9
zbreN?|Jqy$E+4UGTV77+P3FZ!OM%huNcX%P=G>Xvp^;n=>)4}`?Y-59Ibb3yNh%pz
z#jLrD(Q{cMAUX~WhXXg6r~&1ZM1FxD-RtNX9aT>PVxOu9*=vml0ymb||9Il<%H}&K
zSb~_Z$Z7|J-ed}PKXx>2J=rd)9$cJ3p<8!`q<)PdtZ(zAr+@av)r#>P`TWB@jaxpz
zbUIs}KX)>(%>Fhr^LS-LLq`D%B9jROI-bylryul_>B*E|P`ccq(4?mVV4zw(mZi?T
zJ+5wVH?&!%43V(IrZ?;L218h43s01n7Xz!aG*6F>HBV2MHBUEtBH^DFOHiVh196D{
zCQv~HJQYAxEmH3YsVgb~DjHXNDB#&;1%oY9B38^=^fv;51mSTwB2n%hLi&t$uB;nVbA
zmbTrzIZ+3At}7$;LfFxB#kOweX#MAS~^N=+@ST&lhx(?>o=pB!=8KL0Ug3sAc~rJ{N3i-iJzz5
zKiT4{r1dMycBNKKOZEkAyV0m)elVBi741NRq5EvaE_c`r7YykjNHRScC(W9N0E7HG
z#gEPw=jHqG?ClD5ue#x6!RIL?P_FU#efw}^s+7v0OX-B<P%x}WNd66U@Hz1
z?C7FRQNQ0SX0w&GiVsiRV`^ho)^Ve8Y)lR_WNcvVVwKXAXUzi_c?3$q;j1)2W`AX+
zu<$8~A0$o^Nf0ywkw_#Ok4;r7nRbMq*q>KPWkWI^N1UhRCN@io?1+*9z>d!F2k%XM
z`upMwb)}Y@b=hB0QV*x@&q^vaQ1Vk#f#B2+3rY^*bugV7z*;UbRUB9Dp_CV1Ka54^
zqCG)h(?W}uFN{Y;-!b5(`T|?JP=(#
zMDuIj+w_1}&aADSx)=+_Vw8HTohf80tU&HE*^pKWfR-rUJpoTbmu5)O
z-M4>dDuoK)gEEg^(=&K%n>e#Lr61TwOmlg6cx)*LcYWlerM|t@H%9fix|>K<&3XM4
zI$DzJrE**&&>@J1&nHxCG+lr`OY$}DhS6T*WV59WQzA-h{L<6qjm-yZFCTZm?}rht
zvdOm&tWQfN7H020(W@?Y}
zaci>LT$cMX68?Yq@aFS*y}o?DDD$+ft}bn_Mwct!1q9~#$8~jym#kHoDK^~!pkcCDN!hvBfTqPzRu
z(#iNclkK&qYmeoC%w^OP2!xV`%VpO$qz4KzY?f>7+#z*iu|&}GWfsHv-!xlX5o7ac%;5oS?Z#>)oav#>Qy=xW
zw4_pIg9XIOkRJ{Uxm*U1H9|=r>~qz-tyHQ`jMHGHmVAm@(OO<%F8P#Y4#y*H;T$cySwU|
zxe5Bx|ck<+bCj3H97fL>v3`g#skA|8RjK-Jo5Ks{-8CrrWsjcA)}>n<&A>u$5f
zYYEEV@GFmI1pFjm{(+9HHsyp?bTpM#3&%Ol`ex=?A$&9La`QgCls>Y}RTe6wd#GEiGUFJ7u
G!8)Bler
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