aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2020-10-28 13:13:57 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2020-11-01 10:20:55 +0200
commit4eb685d94e89a2aef61047225c1834a89de01de2 (patch)
tree99a6cab3b8766e23aecacc1cb91b00bfcf99700f
parentDrop libc++ default (diff)
downloadrcc-4eb685d94e89a2aef61047225c1834a89de01de2.tar.xz
Simplify rccv0.1.0
- drop qrc parsing and zstd compression
-rw-r--r--.gitmodules3
m---------3rd-party/tabler-icons0
-rw-r--r--lib/compressionctx.h42
-rw-r--r--lib/embed.h88
-rw-r--r--lib/zstd.cpp59
-rw-r--r--meson.build46
-rwxr-xr-xrcc54
-rw-r--r--rcc_format/__init__.py16
-rwxr-xr-xrcc_format/generate.py9
-rw-r--r--rcc_format/util.py62
-rw-r--r--rcc_format/zstd.py43
-rw-r--r--readme.md3
-rw-r--r--test/main.cpp33
-rw-r--r--test/resources.xrc377
14 files changed, 66 insertions, 769 deletions
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e0954d7..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "3rd-party/tabler-icons"]
- path = 3rd-party/tabler-icons
- url = https://github.com/tabler/tabler-icons
diff --git a/3rd-party/tabler-icons b/3rd-party/tabler-icons
deleted file mode 160000
-Subproject ec114c0eb5bbfec35ce32ec7201be01cb01b24d
diff --git a/lib/compressionctx.h b/lib/compressionctx.h
deleted file mode 100644
index a07686f..0000000
--- a/lib/compressionctx.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <span>
-#include <vector>
-#include <cstdint>
-#include <memory>
-
-#pragma once
-
-namespace embed
-{
-
-enum Compression {
- None,
- Zstd
-};
-
-class CompressionCtx
-{
-public:
- virtual ~CompressionCtx() = default;
- [[nodiscard]] virtual std::vector<uint8_t> decompress(const std::span<const uint8_t> &entry) const = 0;
-};
-
-class ZstdCompressionCtx final : public CompressionCtx
-{
-public:
- ZstdCompressionCtx(const std::span<const uint8_t> &dictionary);
- ~ZstdCompressionCtx();
- [[nodiscard]] std::vector<uint8_t> decompress(const std::span<const uint8_t> &entry) const override;
-};
-
-std::unique_ptr<CompressionCtx> make_compression_ctx(const Compression algo, const std::span<const uint8_t> &dict)
-{
- switch(algo)
- {
- case None:
- return nullptr;
- case Zstd:
- return std::make_unique<ZstdCompressionCtx>(dict);
- }
-}
-
-} // namespace embed
diff --git a/lib/embed.h b/lib/embed.h
deleted file mode 100644
index b57d830..0000000
--- a/lib/embed.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#pragma once
-
-#include <array>
-#include <string_view>
-#include "compressionctx.h"
-
-namespace embed
-{
-
-template <std::size_t N>
-class Resources
-{
-public:
- constexpr explicit Resources(
- const std::array<const char *, N> &entries,
- const std::array<std::span<const uint8_t>, N> &values)
- : m_entries(entries)
- , m_values(values)
- {
- }
-
- [[nodiscard]] constexpr int id(const std::string_view &path) const
- {
- for(std::size_t i = 0; i < m_entries.size(); ++i) {
- if(m_entries.at(i) == path)
- return i;
- }
- return -1;
- }
- [[nodiscard]] constexpr std::span<const uint8_t> value(const int id_) const
- {
- if(id_ == -1)
- return {};
- else
- return m_values.at(id_);
- }
- [[nodiscard]] constexpr std::span<const uint8_t> value(const std::string_view &path) const
- {
- return value(id(path));
- }
-
- [[deprecated("With no compression, this function returns a copy; use ::value instead")]]
- [[nodiscard]] std::vector<uint8_t> decompress(const int id_) const
- {
- const auto v = value(id_);
- return { v.begin(), v.end() };
- }
- [[deprecated("With no compression, this function returns a copy; use ::value instead")]]
- [[nodiscard]] std::vector<uint8_t> decompress(const std::string_view &path) const
- {
- const auto v = value(path);
- return { v.begin(), v.end() };
- }
-
-protected:
- const std::array<const char *, N> m_entries;
- const std::array<std::span<const uint8_t>, N> m_values;
-};
-
-template <std::size_t N>
-class CompressedResources final : public Resources<N>
-{
-public:
- explicit CompressedResources(
- const std::array<const char *, N> &entries,
- const std::array<std::span<const uint8_t>, N> &values,
- const Compression algo,
- const std::span<const uint8_t> &dictionary = {})
- : Resources<N>(entries, values)
- , m_compression(make_compression_ctx(algo, dictionary))
- {
- }
- ~CompressedResources() = default;
-
- [[nodiscard]] std::vector<uint8_t> decompress(const int id_) const
- {
- return m_compression->decompress(Resources<N>::value(id_));
- }
- [[nodiscard]] std::vector<uint8_t> decompress(const std::string_view &path) const
- {
- return m_compression->decompress(Resources<N>::value(path));
- }
-
-protected:
- const std::unique_ptr<CompressionCtx> m_compression;
-};
-
-} // namespace embed
diff --git a/lib/zstd.cpp b/lib/zstd.cpp
deleted file mode 100644
index d2c27bc..0000000
--- a/lib/zstd.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "compressionctx.h"
-#include <cassert>
-#include <zstd.h>
-
-using namespace embed;
-
-ZSTD_DDict *dictPtr = nullptr;
-
-ZstdCompressionCtx::ZstdCompressionCtx(const std::span<const uint8_t> &dictionary)
-{
- if(!dictionary.empty()) {
- dictPtr = ZSTD_createDDict(dictionary.data(), dictionary.size());
- }
-}
-
-ZstdCompressionCtx::~ZstdCompressionCtx()
-{
- if(dictPtr != nullptr) {
- ZSTD_freeDDict(dictPtr);
- }
-}
-
-[[nodiscard]]
-std::vector<uint8_t> ZstdCompressionCtx::decompress(const std::span<const uint8_t> &entry) const
-{
- /* Read the content size from the frame header. For simplicity we require
- * that it is always present. By default, zstd will write the content size
- * in the header when it is known. If you can't guarantee that the frame
- * content size is always written into the header, either use streaming
- * decompression, or ZSTD_decompressBound().
- */
- unsigned long long const rSize = ZSTD_getFrameContentSize(entry.data(), entry.size());
- assert(rSize != ZSTD_CONTENTSIZE_ERROR); //, "%s: not compressed by zstd!", fname);
- assert(rSize != ZSTD_CONTENTSIZE_UNKNOWN); //, "%s: original size unknown!", fname);
- std::vector<uint8_t> rBuff(rSize);
-
- /* Check that the dictionary ID matches.
- * If a non-zstd dictionary is used, then both will be zero.
- * By default zstd always writes the dictionary ID into the frame.
- * Zstd will check if there is a dictionary ID mismatch as well.
- */
- unsigned const expectedDictID = ZSTD_getDictID_fromDDict(dictPtr);
- unsigned const actualDictID = ZSTD_getDictID_fromFrame(entry.data(), entry.size());
- assert(actualDictID == expectedDictID); //"DictID mismatch: expected %u got %u",
-
- /* Decompress using the dictionary.
- * If you need to control the decompression parameters, then use the
- * advanced API: ZSTD_DCtx_setParameter(), ZSTD_DCtx_refDDict(), and
- * ZSTD_decompressDCtx().
- */
- ZSTD_DCtx *const dctx = ZSTD_createDCtx();
- assert(dctx != NULL); //, "ZSTD_createDCtx() failed!");
- size_t const dSize = ZSTD_decompress_usingDDict(dctx, rBuff.data(), rSize, entry.data(), entry.size(), dictPtr);
- /* When zstd knows the content size, it will error if it doesn't match. */
- assert(dSize == rSize); //, "Impossible because zstd will check this condition!");
-
- ZSTD_freeDCtx(dctx);
- return rBuff;
-}
diff --git a/meson.build b/meson.build
index dac9ca6..a4b0c6e 100644
--- a/meson.build
+++ b/meson.build
@@ -1,49 +1,13 @@
-project('libembed', ['cpp'],
- version: '0.1',
- default_options: ['cpp_std=c++2a', 'warning_level=3'],
-)
-
-libzstd = dependency('libzstd')
-
-libembed_sourceset = import('sourceset').source_set()
-libembed_sourceset.add(when: libzstd, if_true: [ libzstd, files('lib/zstd.cpp') ] )
-libembed_conf = libembed_sourceset.apply(configuration_data())
-
-libembed = library('embed', libembed_conf.sources(),
- dependencies: libembed_conf.dependencies()
-)
-
-libembed_dep = declare_dependency(
- link_with: libembed,
- include_directories: include_directories('lib/')
+project('rcc', [],
+ version: '0.1.0',
+ license: 'BSD-2-Clause',
)
prog_python = import('python').find_installation('python3')
-
rcc = generator(prog_python,
output: '@BASENAME@.h',
arguments: [ meson.current_source_dir()/'rcc', '--output=@OUTPUT@', '@EXTRA_ARGS@', '@INPUT@' ]
)
-if not meson.is_subproject()
-resources_h = rcc.process(files('test/resources.xrc'), extra_args: [ '--namespace=staticdata', '-' ])
-
-zstd_dictionary = custom_target('zstd_dictionary',
- output: 'zstd_dict',
- input: 'rcc',
- command: [ prog_python, '@INPUT@', 'Zstd', '--train=@OUTPUT@', files('test/resources.xrc') ]
-)
-
-zstd_resources_h = custom_target('zstd_resources.h',
- output: 'zstd_resources.h',
- input: [ 'rcc', zstd_dictionary ],
- command: [prog_python, '@INPUT0@', '--namespace=zstd_data', '--output=@OUTPUT@', 'Zstd', '--dict=@INPUT1@', files('test/resources.xrc')],
-)
-
-test('libembed',
- executable('embed',
- sources: [ 'test/main.cpp', resources_h, zstd_resources_h ],
- dependencies: [ libembed_dep ]
- )
-)
-endif # meson.is_subproject()
+# example usage:
+#rcc.process(files('res/a.svg'), extra_args: [ '--namespace=svg', 'dump' ])
diff --git a/rcc b/rcc
index e0b1ca3..3099ca6 100755
--- a/rcc
+++ b/rcc
@@ -4,48 +4,28 @@ import argparse
import sys
import rcc_format
-def none(filelist, args):
- rcc_format.write_header(args.output, args.namespace)
-
- for f in filelist:
- with open(f.path, 'rb') as contents:
- rcc_format.write_item(args.output, f.variable, contents.read())
-
- rcc_format.write_entries(args.output, filelist)
- print("constexpr auto compression = embed::None;", file=args.output)
-
- rcc_format.write_footer(args.output, args.namespace)
-
if __name__ == "__main__":
parser = argparse.ArgumentParser(
- description='Resource Compiler for C++',
- epilog='For a full list of compression options, check {mode} --help.',
+ description='Simple Resource Compiler for C++20',
+ epilog='For more information check --help.',
)
- mode = parser.add_subparsers(help='compression mode')
-
- none_mode = mode.add_parser('-')
- none_mode.set_defaults(func=none)
-
- zstd_mode = mode.add_parser('Zstd',
- description='use Zstd compression',
- epilog='A dictionary is recommended if compressing many small files. size(source)/size(dictionary) should be >= 10'
+ mode = parser.add_subparsers(help='mode')
+
+ dump_mode = mode.add_parser('dump',
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description='Create a hexdump of [input](s) to [output]',
+ epilog='''The header file will also contain:
+ entries - an array of tuples of (input basename, span of data);
+ get - a get convience function that will return the span of a supplied basename
+All of these are constexpr.''',
)
- zstd_mode.add_argument('--binary', type=str, default='zstd', help='zstd binary name')
- zstd_mode.add_argument('--train', type=argparse.FileType('wb'), help='train dictionary and exit')
- zstd_mode.add_argument('-d', '--dict', type=argparse.FileType('rb'), help='use dictionary, recommended for many similar small files')
- zstd_mode.add_argument('--dsize', type=int, default=512, help='dictionary size, used for training')
- zstd_mode.add_argument('-l', '--level', type=int, default=19, help='compression level')
- zstd_mode.set_defaults(func=rcc_format.zstd)
-
- gen_mode = mode.add_parser('generate', description='Generate .xrc file from inputs')
- gen_mode.add_argument('-a', '--alias', type=str, help='set alias')
- gen_mode.set_defaults(func=rcc_format.generate)
-
- parser.add_argument('input', type=argparse.FileType('rt'), help='input file (.xrc)')
- parser.add_argument('-o', '--output', type=argparse.FileType('wt'), default=sys.stdout, help='output header file')
- parser.add_argument('-n', '--namespace', type=str, default='resources', help='namespace')
+ dump_mode.set_defaults(func=rcc_format.dump)
+
+ parser.add_argument('-o', '--output', type=argparse.FileType('wt'), default=sys.stdout, help='output header file (default: stdout)')
+ parser.add_argument('-n', '--namespace', type=str, default='resources', help='namespace (default: resources)')
+ parser.add_argument('input', type=argparse.FileType('rb'), nargs='+', help='input file(s)')
args=parser.parse_args()
- args.func(rcc_format.filelist(args.input), args)
+ args.func(args.input, args)
diff --git a/rcc_format/__init__.py b/rcc_format/__init__.py
index 48ebd70..629bc54 100644
--- a/rcc_format/__init__.py
+++ b/rcc_format/__init__.py
@@ -1,3 +1,15 @@
from rcc_format.util import *
-from rcc_format.generate import generate
-from rcc_format.zstd import zstd
+from os.path import basename
+
+def dump(filelist, args):
+ write_header(args.output, args.namespace)
+
+ items = []
+ for f in filelist:
+ x = resource(basename(f.name), to_variable_name(f.name), f.name)
+ items.append(x)
+ write_item(args.output, x.variable, f.read())
+
+ write_entries(args.output, items)
+ write_footer(args.output, args.namespace)
+
diff --git a/rcc_format/generate.py b/rcc_format/generate.py
deleted file mode 100755
index f42f6d4..0000000
--- a/rcc_format/generate.py
+++ /dev/null
@@ -1,9 +0,0 @@
-def generate(filelist, args):
- print('<RCC>', file=args.output)
- #echo ' <qresource prefix="/icons">'
- #for f in $@; do
- # echo ' <file alias="'$(basename $f)'">'$f'</file>';
- #done
- #echo ' </qresource>'
- print('</RCC>', file=args.output)
-
diff --git a/rcc_format/util.py b/rcc_format/util.py
index 7fcfe34..af6651b 100644
--- a/rcc_format/util.py
+++ b/rcc_format/util.py
@@ -9,59 +9,55 @@ def to_variable_name(path):
name = name[:-5]
name = name.replace('-', '_')
name = name.replace('.', '_')
- return name
-
-def filelist(file):
- root = xml.parse(file).getroot()
- if root.tag != 'RCC':
- return None
-
- files = []
- for child in root:
- if child.tag == 'qresource':
- prefix = child.attrib['prefix']
- for i in child:
- alias = prefix + '/' + i.attrib['alias']
- variable = to_variable_name(i.text)
- path = i.text
- files.append(resource(alias, variable, path))
-
- return files
+ return "r__" + name
def write_header(file, namespace):
- print("// Autogenerated binary file hexdump", file=file)
- print("// This file may get overwritten by the build system\n", file=file)
- print("#include <embed.h>\n", file=file)
+ print("""// Autogenerated header - this file may get overwritten by the build system
+#pragma once
+
+#include <algorithm>
+#include <span>
+#include <string_view>
+#include <tuple>
+""", file=file)
print("namespace {} {{".format(namespace), file=file)
def write_item(file, array_name, array_data):
- line_items = 0
-
- print("constexpr uint8_t {}[] = {{".format(array_name), file=file)
+ print("constexpr char {}[] = {{".format(array_name), file=file)
- for byte in array_data[0:len(array_data)]:
+ line_items = 0
+ for byte in array_data:
line_items+=1
if line_items == 16:
- print(" 0x{:02X},".format(byte), file=file)
+ print("0x{:02X},".format(byte), file=file)
line_items = 0
else:
- print(" 0x{:02X},".format(byte), file=file, end='')
-
+ print("0x{:02X},".format(byte), file=file, end='')
print("};", file=file)
print("constexpr size_t {}_len = {};\n".format(array_name, len(array_data)), file=file)
def write_entries(file, resource_list):
print("constexpr std::array entries {", file=file)
- for f in resource_list:
- print(" \"{}\", ".format(f.alias), file=file)
- print("};\n", file=file)
- print("constexpr std::array values {", file=file)
for f in resource_list:
- print(" std::span( {}, {}_len ),".format(f.variable, f.variable), file=file)
+ print(" std::make_tuple(\"{}\", std::span({}, {}_len)),"
+ .format(f.alias, f.variable, f.variable), file=file)
+
print("};\n", file=file)
def write_footer(file, namespace):
+ print("""template<typename StrViewLambda>
+constexpr auto get(StrViewLambda name) {
+ static_assert(std::is_same_v<std::string_view, decltype(name())>);
+
+ constexpr auto x = std::find_if(icons::entries.begin(), icons::entries.end(),
+ [=](const auto &tuple) -> bool {
+ return std::get<0>(tuple) == name();
+ });
+ static_assert(x != icons::entries.end());
+
+ return std::get<1>(*x);
+}""", file=file)
print("\n}} // namespace {}".format(namespace), file=file)
diff --git a/rcc_format/zstd.py b/rcc_format/zstd.py
deleted file mode 100644
index 34eeb64..0000000
--- a/rcc_format/zstd.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import subprocess
-from rcc_format.util import *
-
-def zstd(filelist, args):
- if args.train is not None:
- train(filelist, args.train, args.binary, args.dsize)
- return
-
- write_header(args.output, args.namespace)
-
- for f in filelist:
- with open(f.path, 'rb') as contents:
- write_item(args.output, f.variable, compress(contents, args.binary, args.level, dictionary=args.dict))
-
- write_entries(args.output, filelist)
- if args.dict is not None:
- write_item(args.output, 'dict', args.dict.read())
- print("constexpr auto dictionary = std::span(dict, dict_len);", file=args.output)
- else:
- print("constexpr std::span<const uint8_t> dictionary {};", file=args.output)
-
- print("constexpr auto compression = embed::Zstd;", file=args.output)
-
- write_footer(args.output, args.namespace)
-
-def train(filelist, output, zstd_bin, maxdict):
- cmd = [ zstd_bin, '--train', '--maxdict=' + str(maxdict), '-o', output.name ]
-
- for f in filelist:
- cmd.append(f.path)
-
- subprocess.run(cmd)
-
-def compress(file, zstd_bin, level, dictionary=None):
- cmd = [ zstd_bin, '--compress', '--stdout', '-' + str(level) ]
-
- if dictionary is not None:
- cmd.append('-D')
- cmd.append(dictionary.name)
-
- cmd.append(file.name)
- return subprocess.run(cmd, capture_output=True).stdout
-
diff --git a/readme.md b/readme.md
index 9c745ff..c7a8bdd 100644
--- a/readme.md
+++ b/readme.md
@@ -1,10 +1,9 @@
## rcc
-This is a resource compiler for C++, similar to Qt's rcc. It will generate hexdumps of files, optionally compress them with zstd.
+This is a file dump utility that produces C++ headers.
### requirements
* rcc tool requires python
-* zstd compression requires zstd
* c++20 (std::span)
### license
diff --git a/test/main.cpp b/test/main.cpp
deleted file mode 100644
index f18332c..0000000
--- a/test/main.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "resources.h"
-#include "zstd_resources.h"
-#include <cstdio>
-#include <cstdlib>
-
-int main(int, char **)
-{
- constexpr auto size = staticdata::entries.size();
- constexpr embed::Resources static_ctx(staticdata::entries, staticdata::values);
- const embed::CompressedResources zstd_ctx(zstd_data::entries, zstd_data::values, zstd_data::compression, zstd_data::dictionary);
- for(std::size_t i = 0; i < size; ++i) {
- const auto s = static_ctx.value(i);
- const auto v = zstd_ctx.decompress(i);
-
- if(s.size() != v.size()) {
- printf(" raw data at path [%s] size=%li\n", staticdata::entries.at(i), s.size());
- printf(" zstd data at path [%s] size=%li\n", zstd_data::entries.at(i), v.size());
- return EXIT_FAILURE;
- }
-
- if(!std::equal(s.begin(), s.end(), v.begin(), v.end())) {
- printf("failed comparing values at path [%s]\n", staticdata::entries.at(i));
- for(const char &c : s)
- printf("%c", c);
- for(const char &c : v)
- printf("%c", c);
- return EXIT_FAILURE;
- }
- }
- printf("Zstd compression test complete\n");
-
- return EXIT_SUCCESS;
-}
diff --git a/test/resources.xrc b/test/resources.xrc
deleted file mode 100644
index deb35d9..0000000
--- a/test/resources.xrc
+++ /dev/null
@@ -1,377 +0,0 @@
-<RCC>
- <qresource prefix="/icons">
- <file alias="activity.svg">../3rd-party/tabler-icons/icons/activity.svg</file>
- <file alias="ad.svg">../3rd-party/tabler-icons/icons/ad.svg</file>
- <file alias="adjustments.svg">../3rd-party/tabler-icons/icons/adjustments.svg</file>
- <file alias="alarm.svg">../3rd-party/tabler-icons/icons/alarm.svg</file>
- <file alias="alert-circle.svg">../3rd-party/tabler-icons/icons/alert-circle.svg</file>
- <file alias="alert-triangle.svg">../3rd-party/tabler-icons/icons/alert-triangle.svg</file>
- <file alias="align-center.svg">../3rd-party/tabler-icons/icons/align-center.svg</file>
- <file alias="align-justified.svg">../3rd-party/tabler-icons/icons/align-justified.svg</file>
- <file alias="align-left.svg">../3rd-party/tabler-icons/icons/align-left.svg</file>
- <file alias="align-right.svg">../3rd-party/tabler-icons/icons/align-right.svg</file>
- <file alias="aperture.svg">../3rd-party/tabler-icons/icons/aperture.svg</file>
- <file alias="archive.svg">../3rd-party/tabler-icons/icons/archive.svg</file>
- <file alias="arrow-back.svg">../3rd-party/tabler-icons/icons/arrow-back.svg</file>
- <file alias="arrow-bar-down.svg">../3rd-party/tabler-icons/icons/arrow-bar-down.svg</file>
- <file alias="arrow-bar-left.svg">../3rd-party/tabler-icons/icons/arrow-bar-left.svg</file>
- <file alias="arrow-bar-right.svg">../3rd-party/tabler-icons/icons/arrow-bar-right.svg</file>
- <file alias="arrow-bar-up.svg">../3rd-party/tabler-icons/icons/arrow-bar-up.svg</file>
- <file alias="arrow-down-circle.svg">../3rd-party/tabler-icons/icons/arrow-down-circle.svg</file>
- <file alias="arrow-down-left-circle.svg">../3rd-party/tabler-icons/icons/arrow-down-left-circle.svg</file>
- <file alias="arrow-down-left.svg">../3rd-party/tabler-icons/icons/arrow-down-left.svg</file>
- <file alias="arrow-down-right-circle.svg">../3rd-party/tabler-icons/icons/arrow-down-right-circle.svg</file>
- <file alias="arrow-down-right.svg">../3rd-party/tabler-icons/icons/arrow-down-right.svg</file>
- <file alias="arrow-down.svg">../3rd-party/tabler-icons/icons/arrow-down.svg</file>
- <file alias="arrow-forward.svg">../3rd-party/tabler-icons/icons/arrow-forward.svg</file>
- <file alias="arrow-left-circle.svg">../3rd-party/tabler-icons/icons/arrow-left-circle.svg</file>
- <file alias="arrow-left.svg">../3rd-party/tabler-icons/icons/arrow-left.svg</file>
- <file alias="arrow-narrow-down.svg">../3rd-party/tabler-icons/icons/arrow-narrow-down.svg</file>
- <file alias="arrow-narrow-left.svg">../3rd-party/tabler-icons/icons/arrow-narrow-left.svg</file>
- <file alias="arrow-narrow-right.svg">../3rd-party/tabler-icons/icons/arrow-narrow-right.svg</file>
- <file alias="arrow-narrow-up.svg">../3rd-party/tabler-icons/icons/arrow-narrow-up.svg</file>
- <file alias="arrow-right-circle.svg">../3rd-party/tabler-icons/icons/arrow-right-circle.svg</file>
- <file alias="arrow-right.svg">../3rd-party/tabler-icons/icons/arrow-right.svg</file>
- <file alias="arrow-up-circle.svg">../3rd-party/tabler-icons/icons/arrow-up-circle.svg</file>
- <file alias="arrow-up-left-circle.svg">../3rd-party/tabler-icons/icons/arrow-up-left-circle.svg</file>
- <file alias="arrow-up-left.svg">../3rd-party/tabler-icons/icons/arrow-up-left.svg</file>
- <file alias="arrow-up-right-circle.svg">../3rd-party/tabler-icons/icons/arrow-up-right-circle.svg</file>
- <file alias="arrow-up-right.svg">../3rd-party/tabler-icons/icons/arrow-up-right.svg</file>
- <file alias="arrow-up.svg">../3rd-party/tabler-icons/icons/arrow-up.svg</file>
- <file alias="arrows-diagonal-2.svg">../3rd-party/tabler-icons/icons/arrows-diagonal-2.svg</file>
- <file alias="arrows-diagonal.svg">../3rd-party/tabler-icons/icons/arrows-diagonal.svg</file>
- <file alias="arrows-horizontal.svg">../3rd-party/tabler-icons/icons/arrows-horizontal.svg</file>
- <file alias="arrows-maximize.svg">../3rd-party/tabler-icons/icons/arrows-maximize.svg</file>
- <file alias="arrows-minimize.svg">../3rd-party/tabler-icons/icons/arrows-minimize.svg</file>
- <file alias="arrows-sort.svg">../3rd-party/tabler-icons/icons/arrows-sort.svg</file>
- <file alias="arrows-vertical.svg">../3rd-party/tabler-icons/icons/arrows-vertical.svg</file>
- <file alias="artboard.svg">../3rd-party/tabler-icons/icons/artboard.svg</file>
- <file alias="at.svg">../3rd-party/tabler-icons/icons/at.svg</file>
- <file alias="award.svg">../3rd-party/tabler-icons/icons/award.svg</file>
- <file alias="backspace.svg">../3rd-party/tabler-icons/icons/backspace.svg</file>
- <file alias="ban.svg">../3rd-party/tabler-icons/icons/ban.svg</file>
- <file alias="battery-1.svg">../3rd-party/tabler-icons/icons/battery-1.svg</file>
- <file alias="battery-2.svg">../3rd-party/tabler-icons/icons/battery-2.svg</file>
- <file alias="battery-3.svg">../3rd-party/tabler-icons/icons/battery-3.svg</file>
- <file alias="battery-4.svg">../3rd-party/tabler-icons/icons/battery-4.svg</file>
- <file alias="battery-charging.svg">../3rd-party/tabler-icons/icons/battery-charging.svg</file>
- <file alias="battery.svg">../3rd-party/tabler-icons/icons/battery.svg</file>
- <file alias="bed.svg">../3rd-party/tabler-icons/icons/bed.svg</file>
- <file alias="bell.svg">../3rd-party/tabler-icons/icons/bell.svg</file>
- <file alias="bike.svg">../3rd-party/tabler-icons/icons/bike.svg</file>
- <file alias="bluetooth.svg">../3rd-party/tabler-icons/icons/bluetooth.svg</file>
- <file alias="bolt.svg">../3rd-party/tabler-icons/icons/bolt.svg</file>
- <file alias="book.svg">../3rd-party/tabler-icons/icons/book.svg</file>
- <file alias="bookmark.svg">../3rd-party/tabler-icons/icons/bookmark.svg</file>
- <file alias="border-all.svg">../3rd-party/tabler-icons/icons/border-all.svg</file>
- <file alias="border-bottom.svg">../3rd-party/tabler-icons/icons/border-bottom.svg</file>
- <file alias="border-horizontal.svg">../3rd-party/tabler-icons/icons/border-horizontal.svg</file>
- <file alias="border-inner.svg">../3rd-party/tabler-icons/icons/border-inner.svg</file>
- <file alias="border-left.svg">../3rd-party/tabler-icons/icons/border-left.svg</file>
- <file alias="border-none.svg">../3rd-party/tabler-icons/icons/border-none.svg</file>
- <file alias="border-outer.svg">../3rd-party/tabler-icons/icons/border-outer.svg</file>
- <file alias="border-right.svg">../3rd-party/tabler-icons/icons/border-right.svg</file>
- <file alias="border-top.svg">../3rd-party/tabler-icons/icons/border-top.svg</file>
- <file alias="border-vertical.svg">../3rd-party/tabler-icons/icons/border-vertical.svg</file>
- <file alias="box.svg">../3rd-party/tabler-icons/icons/box.svg</file>
- <file alias="briefcase.svg">../3rd-party/tabler-icons/icons/briefcase.svg</file>
- <file alias="bucket.svg">../3rd-party/tabler-icons/icons/bucket.svg</file>
- <file alias="bug.svg">../3rd-party/tabler-icons/icons/bug.svg</file>
- <file alias="building-arch.svg">../3rd-party/tabler-icons/icons/building-arch.svg</file>
- <file alias="building-bridge-2.svg">../3rd-party/tabler-icons/icons/building-bridge-2.svg</file>
- <file alias="building-bridge.svg">../3rd-party/tabler-icons/icons/building-bridge.svg</file>
- <file alias="building-church.svg">../3rd-party/tabler-icons/icons/building-church.svg</file>
- <file alias="building-hospital.svg">../3rd-party/tabler-icons/icons/building-hospital.svg</file>
- <file alias="building-store.svg">../3rd-party/tabler-icons/icons/building-store.svg</file>
- <file alias="building.svg">../3rd-party/tabler-icons/icons/building.svg</file>
- <file alias="bulb-off.svg">../3rd-party/tabler-icons/icons/bulb-off.svg</file>
- <file alias="bulb.svg">../3rd-party/tabler-icons/icons/bulb.svg</file>
- <file alias="calendar-event.svg">../3rd-party/tabler-icons/icons/calendar-event.svg</file>
- <file alias="calendar.svg">../3rd-party/tabler-icons/icons/calendar.svg</file>
- <file alias="camera.svg">../3rd-party/tabler-icons/icons/camera.svg</file>
- <file alias="caret-down.svg">../3rd-party/tabler-icons/icons/caret-down.svg</file>
- <file alias="caret-left.svg">../3rd-party/tabler-icons/icons/caret-left.svg</file>
- <file alias="caret-right.svg">../3rd-party/tabler-icons/icons/caret-right.svg</file>
- <file alias="caret-up.svg">../3rd-party/tabler-icons/icons/caret-up.svg</file>
- <file alias="cash.svg">../3rd-party/tabler-icons/icons/cash.svg</file>
- <file alias="cast.svg">../3rd-party/tabler-icons/icons/cast.svg</file>
- <file alias="chart-area-line.svg">../3rd-party/tabler-icons/icons/chart-area-line.svg</file>
- <file alias="chart-area.svg">../3rd-party/tabler-icons/icons/chart-area.svg</file>
- <file alias="chart-bar.svg">../3rd-party/tabler-icons/icons/chart-bar.svg</file>
- <file alias="chart-candle.svg">../3rd-party/tabler-icons/icons/chart-candle.svg</file>
- <file alias="chart-donut.svg">../3rd-party/tabler-icons/icons/chart-donut.svg</file>
- <file alias="chart-line.svg">../3rd-party/tabler-icons/icons/chart-line.svg</file>
- <file alias="chart-pie.svg">../3rd-party/tabler-icons/icons/chart-pie.svg</file>
- <file alias="check.svg">../3rd-party/tabler-icons/icons/check.svg</file>
- <file alias="chevron-down.svg">../3rd-party/tabler-icons/icons/chevron-down.svg</file>
- <file alias="chevron-left.svg">../3rd-party/tabler-icons/icons/chevron-left.svg</file>
- <file alias="chevron-right.svg">../3rd-party/tabler-icons/icons/chevron-right.svg</file>
- <file alias="chevron-up.svg">../3rd-party/tabler-icons/icons/chevron-up.svg</file>
- <file alias="chevrons-down.svg">../3rd-party/tabler-icons/icons/chevrons-down.svg</file>
- <file alias="chevrons-left.svg">../3rd-party/tabler-icons/icons/chevrons-left.svg</file>
- <file alias="chevrons-right.svg">../3rd-party/tabler-icons/icons/chevrons-right.svg</file>
- <file alias="chevrons-up.svg">../3rd-party/tabler-icons/icons/chevrons-up.svg</file>
- <file alias="circle-check.svg">../3rd-party/tabler-icons/icons/circle-check.svg</file>
- <file alias="circle-minus.svg">../3rd-party/tabler-icons/icons/circle-minus.svg</file>
- <file alias="circle-plus.svg">../3rd-party/tabler-icons/icons/circle-plus.svg</file>
- <file alias="circle-x.svg">../3rd-party/tabler-icons/icons/circle-x.svg</file>
- <file alias="circle.svg">../3rd-party/tabler-icons/icons/circle.svg</file>
- <file alias="clipboard-check.svg">../3rd-party/tabler-icons/icons/clipboard-check.svg</file>
- <file alias="clipboard-list.svg">../3rd-party/tabler-icons/icons/clipboard-list.svg</file>
- <file alias="clipboard-x.svg">../3rd-party/tabler-icons/icons/clipboard-x.svg</file>
- <file alias="clipboard.svg">../3rd-party/tabler-icons/icons/clipboard.svg</file>
- <file alias="clock.svg">../3rd-party/tabler-icons/icons/clock.svg</file>
- <file alias="cloud-download.svg">../3rd-party/tabler-icons/icons/cloud-download.svg</file>
- <file alias="cloud-rain.svg">../3rd-party/tabler-icons/icons/cloud-rain.svg</file>
- <file alias="cloud-snow.svg">../3rd-party/tabler-icons/icons/cloud-snow.svg</file>
- <file alias="cloud-storm.svg">../3rd-party/tabler-icons/icons/cloud-storm.svg</file>
- <file alias="cloud-upload.svg">../3rd-party/tabler-icons/icons/cloud-upload.svg</file>
- <file alias="cloud.svg">../3rd-party/tabler-icons/icons/cloud.svg</file>
- <file alias="code.svg">../3rd-party/tabler-icons/icons/code.svg</file>
- <file alias="color-swatch.svg">../3rd-party/tabler-icons/icons/color-swatch.svg</file>
- <file alias="command.svg">../3rd-party/tabler-icons/icons/command.svg</file>
- <file alias="compass.svg">../3rd-party/tabler-icons/icons/compass.svg</file>
- <file alias="copy.svg">../3rd-party/tabler-icons/icons/copy.svg</file>
- <file alias="copyright.svg">../3rd-party/tabler-icons/icons/copyright.svg</file>
- <file alias="corner-down-left.svg">../3rd-party/tabler-icons/icons/corner-down-left.svg</file>
- <file alias="corner-down-right.svg">../3rd-party/tabler-icons/icons/corner-down-right.svg</file>
- <file alias="corner-left-down.svg">../3rd-party/tabler-icons/icons/corner-left-down.svg</file>
- <file alias="corner-left-up.svg">../3rd-party/tabler-icons/icons/corner-left-up.svg</file>
- <file alias="corner-right-down.svg">../3rd-party/tabler-icons/icons/corner-right-down.svg</file>
- <file alias="corner-right-up.svg">../3rd-party/tabler-icons/icons/corner-right-up.svg</file>
- <file alias="corner-up-left.svg">../3rd-party/tabler-icons/icons/corner-up-left.svg</file>
- <file alias="corner-up-right.svg">../3rd-party/tabler-icons/icons/corner-up-right.svg</file>
- <file alias="credit-card.svg">../3rd-party/tabler-icons/icons/credit-card.svg</file>
- <file alias="crop.svg">../3rd-party/tabler-icons/icons/crop.svg</file>
- <file alias="cut.svg">../3rd-party/tabler-icons/icons/cut.svg</file>
- <file alias="dashboard.svg">../3rd-party/tabler-icons/icons/dashboard.svg</file>
- <file alias="database.svg">../3rd-party/tabler-icons/icons/database.svg</file>
- <file alias="device-desktop.svg">../3rd-party/tabler-icons/icons/device-desktop.svg</file>
- <file alias="device-floppy.svg">../3rd-party/tabler-icons/icons/device-floppy.svg</file>
- <file alias="device-gamepad.svg">../3rd-party/tabler-icons/icons/device-gamepad.svg</file>
- <file alias="device-laptop.svg">../3rd-party/tabler-icons/icons/device-laptop.svg</file>
- <file alias="device-mobile.svg">../3rd-party/tabler-icons/icons/device-mobile.svg</file>
- <file alias="device-speaker.svg">../3rd-party/tabler-icons/icons/device-speaker.svg</file>
- <file alias="device-tablet.svg">../3rd-party/tabler-icons/icons/device-tablet.svg</file>
- <file alias="device-tv.svg">../3rd-party/tabler-icons/icons/device-tv.svg</file>
- <file alias="diamond.svg">../3rd-party/tabler-icons/icons/diamond.svg</file>
- <file alias="dice.svg">../3rd-party/tabler-icons/icons/dice.svg</file>
- <file alias="directions.svg">../3rd-party/tabler-icons/icons/directions.svg</file>
- <file alias="disabled.svg">../3rd-party/tabler-icons/icons/disabled.svg</file>
- <file alias="disc.svg">../3rd-party/tabler-icons/icons/disc.svg</file>
- <file alias="dots-circle-horizontal.svg">../3rd-party/tabler-icons/icons/dots-circle-horizontal.svg</file>
- <file alias="dots-diagonal-2.svg">../3rd-party/tabler-icons/icons/dots-diagonal-2.svg</file>
- <file alias="dots-diagonal.svg">../3rd-party/tabler-icons/icons/dots-diagonal.svg</file>
- <file alias="dots-vertical.svg">../3rd-party/tabler-icons/icons/dots-vertical.svg</file>
- <file alias="dots.svg">../3rd-party/tabler-icons/icons/dots.svg</file>
- <file alias="download.svg">../3rd-party/tabler-icons/icons/download.svg</file>
- <file alias="droplet.svg">../3rd-party/tabler-icons/icons/droplet.svg</file>
- <file alias="edit.svg">../3rd-party/tabler-icons/icons/edit.svg</file>
- <file alias="external-link.svg">../3rd-party/tabler-icons/icons/external-link.svg</file>
- <file alias="eye.svg">../3rd-party/tabler-icons/icons/eye.svg</file>
- <file alias="face-id.svg">../3rd-party/tabler-icons/icons/face-id.svg</file>
- <file alias="file-check.svg">../3rd-party/tabler-icons/icons/file-check.svg</file>
- <file alias="file-download.svg">../3rd-party/tabler-icons/icons/file-download.svg</file>
- <file alias="file-invoice.svg">../3rd-party/tabler-icons/icons/file-invoice.svg</file>
- <file alias="file-minus.svg">../3rd-party/tabler-icons/icons/file-minus.svg</file>
- <file alias="file-music.svg">../3rd-party/tabler-icons/icons/file-music.svg</file>
- <file alias="file-plus.svg">../3rd-party/tabler-icons/icons/file-plus.svg</file>
- <file alias="file-shredder.svg">../3rd-party/tabler-icons/icons/file-shredder.svg</file>
- <file alias="file-text.svg">../3rd-party/tabler-icons/icons/file-text.svg</file>
- <file alias="file-x.svg">../3rd-party/tabler-icons/icons/file-x.svg</file>
- <file alias="file.svg">../3rd-party/tabler-icons/icons/file.svg</file>
- <file alias="filter.svg">../3rd-party/tabler-icons/icons/filter.svg</file>
- <file alias="flag.svg">../3rd-party/tabler-icons/icons/flag.svg</file>
- <file alias="flip-horizontal.svg">../3rd-party/tabler-icons/icons/flip-horizontal.svg</file>
- <file alias="flip-vertical.svg">../3rd-party/tabler-icons/icons/flip-vertical.svg</file>
- <file alias="floppy-disk.svg">../3rd-party/tabler-icons/icons/floppy-disk.svg</file>
- <file alias="folder-minus.svg">../3rd-party/tabler-icons/icons/folder-minus.svg</file>
- <file alias="folder-plus.svg">../3rd-party/tabler-icons/icons/folder-plus.svg</file>
- <file alias="folder-x.svg">../3rd-party/tabler-icons/icons/folder-x.svg</file>
- <file alias="folder.svg">../3rd-party/tabler-icons/icons/folder.svg</file>
- <file alias="folders.svg">../3rd-party/tabler-icons/icons/folders.svg</file>
- <file alias="frame.svg">../3rd-party/tabler-icons/icons/frame.svg</file>
- <file alias="friends.svg">../3rd-party/tabler-icons/icons/friends.svg</file>
- <file alias="gauge.svg">../3rd-party/tabler-icons/icons/gauge.svg</file>
- <file alias="gift.svg">../3rd-party/tabler-icons/icons/gift.svg</file>
- <file alias="git-branch.svg">../3rd-party/tabler-icons/icons/git-branch.svg</file>
- <file alias="git-commit.svg">../3rd-party/tabler-icons/icons/git-commit.svg</file>
- <file alias="git-compare.svg">../3rd-party/tabler-icons/icons/git-compare.svg</file>
- <file alias="git-merge.svg">../3rd-party/tabler-icons/icons/git-merge.svg</file>
- <file alias="git-pull-request.svg">../3rd-party/tabler-icons/icons/git-pull-request.svg</file>
- <file alias="glass-full.svg">../3rd-party/tabler-icons/icons/glass-full.svg</file>
- <file alias="glass.svg">../3rd-party/tabler-icons/icons/glass.svg</file>
- <file alias="globe.svg">../3rd-party/tabler-icons/icons/globe.svg</file>
- <file alias="grid-dots.svg">../3rd-party/tabler-icons/icons/grid-dots.svg</file>
- <file alias="grid.svg">../3rd-party/tabler-icons/icons/grid.svg</file>
- <file alias="hash.svg">../3rd-party/tabler-icons/icons/hash.svg</file>
- <file alias="headphones.svg">../3rd-party/tabler-icons/icons/headphones.svg</file>
- <file alias="heart.svg">../3rd-party/tabler-icons/icons/heart.svg</file>
- <file alias="help.svg">../3rd-party/tabler-icons/icons/help.svg</file>
- <file alias="home-2.svg">../3rd-party/tabler-icons/icons/home-2.svg</file>
- <file alias="home.svg">../3rd-party/tabler-icons/icons/home.svg</file>
- <file alias="ice-cream.svg">../3rd-party/tabler-icons/icons/ice-cream.svg</file>
- <file alias="id.svg">../3rd-party/tabler-icons/icons/id.svg</file>
- <file alias="inbox.svg">../3rd-party/tabler-icons/icons/inbox.svg</file>
- <file alias="infinity.svg">../3rd-party/tabler-icons/icons/infinity.svg</file>
- <file alias="info-circle.svg">../3rd-party/tabler-icons/icons/info-circle.svg</file>
- <file alias="info-square.svg">../3rd-party/tabler-icons/icons/info-square.svg</file>
- <file alias="key.svg">../3rd-party/tabler-icons/icons/key.svg</file>
- <file alias="layers-difference.svg">../3rd-party/tabler-icons/icons/layers-difference.svg</file>
- <file alias="layers-intersect.svg">../3rd-party/tabler-icons/icons/layers-intersect.svg</file>
- <file alias="layers-subtract.svg">../3rd-party/tabler-icons/icons/layers-subtract.svg</file>
- <file alias="layers-union.svg">../3rd-party/tabler-icons/icons/layers-union.svg</file>
- <file alias="layout-2.svg">../3rd-party/tabler-icons/icons/layout-2.svg</file>
- <file alias="layout-align-bottom.svg">../3rd-party/tabler-icons/icons/layout-align-bottom.svg</file>
- <file alias="layout-align-center.svg">../3rd-party/tabler-icons/icons/layout-align-center.svg</file>
- <file alias="layout-align-left.svg">../3rd-party/tabler-icons/icons/layout-align-left.svg</file>
- <file alias="layout-align-middle.svg">../3rd-party/tabler-icons/icons/layout-align-middle.svg</file>
- <file alias="layout-align-right.svg">../3rd-party/tabler-icons/icons/layout-align-right.svg</file>
- <file alias="layout-align-top.svg">../3rd-party/tabler-icons/icons/layout-align-top.svg</file>
- <file alias="layout-bottombar.svg">../3rd-party/tabler-icons/icons/layout-bottombar.svg</file>
- <file alias="layout-columns.svg">../3rd-party/tabler-icons/icons/layout-columns.svg</file>
- <file alias="layout-distribute-horizontal.svg">../3rd-party/tabler-icons/icons/layout-distribute-horizontal.svg</file>
- <file alias="layout-distribute-vertical.svg">../3rd-party/tabler-icons/icons/layout-distribute-vertical.svg</file>
- <file alias="layout-navbar.svg">../3rd-party/tabler-icons/icons/layout-navbar.svg</file>
- <file alias="layout-rows.svg">../3rd-party/tabler-icons/icons/layout-rows.svg</file>
- <file alias="layout-sidebar-right.svg">../3rd-party/tabler-icons/icons/layout-sidebar-right.svg</file>
- <file alias="layout-sidebar.svg">../3rd-party/tabler-icons/icons/layout-sidebar.svg</file>
- <file alias="layout.svg">../3rd-party/tabler-icons/icons/layout.svg</file>
- <file alias="lego.svg">../3rd-party/tabler-icons/icons/lego.svg</file>
- <file alias="lifebuoy.svg">../3rd-party/tabler-icons/icons/lifebuoy.svg</file>
- <file alias="link.svg">../3rd-party/tabler-icons/icons/link.svg</file>
- <file alias="list-check.svg">../3rd-party/tabler-icons/icons/list-check.svg</file>
- <file alias="list.svg">../3rd-party/tabler-icons/icons/list.svg</file>
- <file alias="live-photo.svg">../3rd-party/tabler-icons/icons/live-photo.svg</file>
- <file alias="location.svg">../3rd-party/tabler-icons/icons/location.svg</file>
- <file alias="lock-open.svg">../3rd-party/tabler-icons/icons/lock-open.svg</file>
- <file alias="lock.svg">../3rd-party/tabler-icons/icons/lock.svg</file>
- <file alias="magnet.svg">../3rd-party/tabler-icons/icons/magnet.svg</file>
- <file alias="mail-opened.svg">../3rd-party/tabler-icons/icons/mail-opened.svg</file>
- <file alias="mail.svg">../3rd-party/tabler-icons/icons/mail.svg</file>
- <file alias="man.svg">../3rd-party/tabler-icons/icons/man.svg</file>
- <file alias="map-2.svg">../3rd-party/tabler-icons/icons/map-2.svg</file>
- <file alias="map-pin.svg">../3rd-party/tabler-icons/icons/map-pin.svg</file>
- <file alias="map.svg">../3rd-party/tabler-icons/icons/map.svg</file>
- <file alias="maximize.svg">../3rd-party/tabler-icons/icons/maximize.svg</file>
- <file alias="menu.svg">../3rd-party/tabler-icons/icons/menu.svg</file>
- <file alias="message-2.svg">../3rd-party/tabler-icons/icons/message-2.svg</file>
- <file alias="message-circle.svg">../3rd-party/tabler-icons/icons/message-circle.svg</file>
- <file alias="message-dots.svg">../3rd-party/tabler-icons/icons/message-dots.svg</file>
- <file alias="message.svg">../3rd-party/tabler-icons/icons/message.svg</file>
- <file alias="messages.svg">../3rd-party/tabler-icons/icons/messages.svg</file>
- <file alias="microphone.svg">../3rd-party/tabler-icons/icons/microphone.svg</file>
- <file alias="minimize.svg">../3rd-party/tabler-icons/icons/minimize.svg</file>
- <file alias="minus.svg">../3rd-party/tabler-icons/icons/minus.svg</file>
- <file alias="mood-confuzed.svg">../3rd-party/tabler-icons/icons/mood-confuzed.svg</file>
- <file alias="mood-happy.svg">../3rd-party/tabler-icons/icons/mood-happy.svg</file>
- <file alias="mood-neutral.svg">../3rd-party/tabler-icons/icons/mood-neutral.svg</file>
- <file alias="mood-sad.svg">../3rd-party/tabler-icons/icons/mood-sad.svg</file>
- <file alias="mood-smile.svg">../3rd-party/tabler-icons/icons/mood-smile.svg</file>
- <file alias="moon.svg">../3rd-party/tabler-icons/icons/moon.svg</file>
- <file alias="mouse.svg">../3rd-party/tabler-icons/icons/mouse.svg</file>
- <file alias="movie.svg">../3rd-party/tabler-icons/icons/movie.svg</file>
- <file alias="mug.svg">../3rd-party/tabler-icons/icons/mug.svg</file>
- <file alias="music.svg">../3rd-party/tabler-icons/icons/music.svg</file>
- <file alias="news.svg">../3rd-party/tabler-icons/icons/news.svg</file>
- <file alias="note.svg">../3rd-party/tabler-icons/icons/note.svg</file>
- <file alias="notes.svg">../3rd-party/tabler-icons/icons/notes.svg</file>
- <file alias="notification.svg">../3rd-party/tabler-icons/icons/notification.svg</file>
- <file alias="package.svg">../3rd-party/tabler-icons/icons/package.svg</file>
- <file alias="paint.svg">../3rd-party/tabler-icons/icons/paint.svg</file>
- <file alias="palette.svg">../3rd-party/tabler-icons/icons/palette.svg</file>
- <file alias="paperclip.svg">../3rd-party/tabler-icons/icons/paperclip.svg</file>
- <file alias="parking.svg">../3rd-party/tabler-icons/icons/parking.svg</file>
- <file alias="pencil.svg">../3rd-party/tabler-icons/icons/pencil.svg</file>
- <file alias="phone-call.svg">../3rd-party/tabler-icons/icons/phone-call.svg</file>
- <file alias="phone-incoming.svg">../3rd-party/tabler-icons/icons/phone-incoming.svg</file>
- <file alias="phone-outgoing.svg">../3rd-party/tabler-icons/icons/phone-outgoing.svg</file>
- <file alias="phone-pause.svg">../3rd-party/tabler-icons/icons/phone-pause.svg</file>
- <file alias="phone.svg">../3rd-party/tabler-icons/icons/phone.svg</file>
- <file alias="photo.svg">../3rd-party/tabler-icons/icons/photo.svg</file>
- <file alias="plane.svg">../3rd-party/tabler-icons/icons/plane.svg</file>
- <file alias="plus.svg">../3rd-party/tabler-icons/icons/plus.svg</file>
- <file alias="point.svg">../3rd-party/tabler-icons/icons/point.svg</file>
- <file alias="power.svg">../3rd-party/tabler-icons/icons/power.svg</file>
- <file alias="presentation.svg">../3rd-party/tabler-icons/icons/presentation.svg</file>
- <file alias="printer.svg">../3rd-party/tabler-icons/icons/printer.svg</file>
- <file alias="prompt.svg">../3rd-party/tabler-icons/icons/prompt.svg</file>
- <file alias="puzzle.svg">../3rd-party/tabler-icons/icons/puzzle.svg</file>
- <file alias="qrcode.svg">../3rd-party/tabler-icons/icons/qrcode.svg</file>
- <file alias="record-mail.svg">../3rd-party/tabler-icons/icons/record-mail.svg</file>
- <file alias="refresh.svg">../3rd-party/tabler-icons/icons/refresh.svg</file>
- <file alias="registered.svg">../3rd-party/tabler-icons/icons/registered.svg</file>
- <file alias="repeat-once.svg">../3rd-party/tabler-icons/icons/repeat-once.svg</file>
- <file alias="repeat.svg">../3rd-party/tabler-icons/icons/repeat.svg</file>
- <file alias="rotate-clockwise.svg">../3rd-party/tabler-icons/icons/rotate-clockwise.svg</file>
- <file alias="rotate.svg">../3rd-party/tabler-icons/icons/rotate.svg</file>
- <file alias="route.svg">../3rd-party/tabler-icons/icons/route.svg</file>
- <file alias="router.svg">../3rd-party/tabler-icons/icons/router.svg</file>
- <file alias="rss.svg">../3rd-party/tabler-icons/icons/rss.svg</file>
- <file alias="ruler.svg">../3rd-party/tabler-icons/icons/ruler.svg</file>
- <file alias="scissors.svg">../3rd-party/tabler-icons/icons/scissors.svg</file>
- <file alias="search.svg">../3rd-party/tabler-icons/icons/search.svg</file>
- <file alias="selector.svg">../3rd-party/tabler-icons/icons/selector.svg</file>
- <file alias="send.svg">../3rd-party/tabler-icons/icons/send.svg</file>
- <file alias="server.svg">../3rd-party/tabler-icons/icons/server.svg</file>
- <file alias="settings.svg">../3rd-party/tabler-icons/icons/settings.svg</file>
- <file alias="share.svg">../3rd-party/tabler-icons/icons/share.svg</file>
- <file alias="shield-check.svg">../3rd-party/tabler-icons/icons/shield-check.svg</file>
- <file alias="shield-x.svg">../3rd-party/tabler-icons/icons/shield-x.svg</file>
- <file alias="shield.svg">../3rd-party/tabler-icons/icons/shield.svg</file>
- <file alias="shopping-cart.svg">../3rd-party/tabler-icons/icons/shopping-cart.svg</file>
- <file alias="sort-ascending.svg">../3rd-party/tabler-icons/icons/sort-ascending.svg</file>
- <file alias="sort-descending.svg">../3rd-party/tabler-icons/icons/sort-descending.svg</file>
- <file alias="square-check.svg">../3rd-party/tabler-icons/icons/square-check.svg</file>
- <file alias="square-minus.svg">../3rd-party/tabler-icons/icons/square-minus.svg</file>
- <file alias="square-plus.svg">../3rd-party/tabler-icons/icons/square-plus.svg</file>
- <file alias="square-x.svg">../3rd-party/tabler-icons/icons/square-x.svg</file>
- <file alias="square.svg">../3rd-party/tabler-icons/icons/square.svg</file>
- <file alias="stack.svg">../3rd-party/tabler-icons/icons/stack.svg</file>
- <file alias="star.svg">../3rd-party/tabler-icons/icons/star.svg</file>
- <file alias="sticker.svg">../3rd-party/tabler-icons/icons/sticker.svg</file>
- <file alias="sum.svg">../3rd-party/tabler-icons/icons/sum.svg</file>
- <file alias="sun.svg">../3rd-party/tabler-icons/icons/sun.svg</file>
- <file alias="switch-horizontal.svg">../3rd-party/tabler-icons/icons/switch-horizontal.svg</file>
- <file alias="switch-vertical.svg">../3rd-party/tabler-icons/icons/switch-vertical.svg</file>
- <file alias="switch.svg">../3rd-party/tabler-icons/icons/switch.svg</file>
- <file alias="tag.svg">../3rd-party/tabler-icons/icons/tag.svg</file>
- <file alias="target.svg">../3rd-party/tabler-icons/icons/target.svg</file>
- <file alias="temperature-celsius.svg">../3rd-party/tabler-icons/icons/temperature-celsius.svg</file>
- <file alias="temperature-fahrenheit.svg">../3rd-party/tabler-icons/icons/temperature-fahrenheit.svg</file>
- <file alias="temperature.svg">../3rd-party/tabler-icons/icons/temperature.svg</file>
- <file alias="template.svg">../3rd-party/tabler-icons/icons/template.svg</file>
- <file alias="test-pipe.svg">../3rd-party/tabler-icons/icons/test-pipe.svg</file>
- <file alias="thumb-down.svg">../3rd-party/tabler-icons/icons/thumb-down.svg</file>
- <file alias="thumb-up.svg">../3rd-party/tabler-icons/icons/thumb-up.svg</file>
- <file alias="ticket.svg">../3rd-party/tabler-icons/icons/ticket.svg</file>
- <file alias="toggle-left.svg">../3rd-party/tabler-icons/icons/toggle-left.svg</file>
- <file alias="toggle-right.svg">../3rd-party/tabler-icons/icons/toggle-right.svg</file>
- <file alias="tool.svg">../3rd-party/tabler-icons/icons/tool.svg</file>
- <file alias="trash.svg">../3rd-party/tabler-icons/icons/trash.svg</file>
- <file alias="trending-down.svg">../3rd-party/tabler-icons/icons/trending-down.svg</file>
- <file alias="trending-up.svg">../3rd-party/tabler-icons/icons/trending-up.svg</file>
- <file alias="triangle.svg">../3rd-party/tabler-icons/icons/triangle.svg</file>
- <file alias="trophy.svg">../3rd-party/tabler-icons/icons/trophy.svg</file>
- <file alias="unlink.svg">../3rd-party/tabler-icons/icons/unlink.svg</file>
- <file alias="upload.svg">../3rd-party/tabler-icons/icons/upload.svg</file>
- <file alias="urgent.svg">../3rd-party/tabler-icons/icons/urgent.svg</file>
- <file alias="user-check.svg">../3rd-party/tabler-icons/icons/user-check.svg</file>
- <file alias="user-minus.svg">../3rd-party/tabler-icons/icons/user-minus.svg</file>
- <file alias="user-plus.svg">../3rd-party/tabler-icons/icons/user-plus.svg</file>
- <file alias="user-x.svg">../3rd-party/tabler-icons/icons/user-x.svg</file>
- <file alias="user.svg">../3rd-party/tabler-icons/icons/user.svg</file>
- <file alias="viewfinder.svg">../3rd-party/tabler-icons/icons/viewfinder.svg</file>
- <file alias="virus.svg">../3rd-party/tabler-icons/icons/virus.svg</file>
- <file alias="volume-2.svg">../3rd-party/tabler-icons/icons/volume-2.svg</file>
- <file alias="volume-3.svg">../3rd-party/tabler-icons/icons/volume-3.svg</file>
- <file alias="volume.svg">../3rd-party/tabler-icons/icons/volume.svg</file>
- <file alias="wallet.svg">../3rd-party/tabler-icons/icons/wallet.svg</file>
- <file alias="wifi.svg">../3rd-party/tabler-icons/icons/wifi.svg</file>
- <file alias="woman.svg">../3rd-party/tabler-icons/icons/woman.svg</file>
- <file alias="world.svg">../3rd-party/tabler-icons/icons/world.svg</file>
- <file alias="x.svg">../3rd-party/tabler-icons/icons/x.svg</file>
- <file alias="zoom-in.svg">../3rd-party/tabler-icons/icons/zoom-in.svg</file>
- <file alias="zoom-out.svg">../3rd-party/tabler-icons/icons/zoom-out.svg</file>
- </qresource>
-</RCC>