diff --git a/common/3.0/update_frontend_image/index.html b/common/3.0/update_frontend_image/index.html index ef11794c0..582fa3a90 100644 --- a/common/3.0/update_frontend_image/index.html +++ b/common/3.0/update_frontend_image/index.html @@ -4013,13 +4013,9 @@
kubectl delete pod -l run=nginx-od -n abcdesktop
-
-Start you web browser. You can read the new project name at the home page.
- -The new login animation paints acme
desktop
You have updated the html web page for abcdesktop release 3.0
+Start you web browser. You can read the new project name at the home page. After login you get the new color.
+ +You have updated the html web page for abcdesktop release 3.X
diff --git a/search/search_index.json b/search/search_index.json index aefe93acb..8f2ce47e3 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.
abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.
This flexible working environment simplifies usage like
You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.
To reach the demo website, follow the link https://demo.abcdesktop.io
"},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.
"},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"You can watch the youtube video sample. This video describes the Quick installation process.
Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
"},{"location":"#adopters","title":"Adopters","text":"Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!
Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":"abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:
To fully use copy and paste
features, from your local device to your abcdesktop (and vice versa), choose Chrome
, Chromium or Microsoft Edge Chromium. The copy and paste
feature is also supported on Firefox with a dedicated abcdesktop extension.
abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.
"},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.
"},{"location":"adopters/","title":"Adopters","text":"Here are some of the organizations we know are using abcdesktop.io.
Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applicationsIf you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request to add entry in this list.
"},{"location":"applicationsformat/","title":"Application image format","text":"abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.
"},{"location":"applicationsformat/#requirements","title":"Requirements","text":"Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.
LABEL oc.type=app\n
"},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon
string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata
string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword
string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile
string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat
string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
office oc.launch
string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template
string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path
string Path to the application binary /usr/bin/firefox oc.args
string arguments added to the command --open oc.name
string Name of the application Firefox oc.displayname
string Display Name show by Web interface Firefox oc.type
string Always set to the value 'app' app oc.mimetype
string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview
string Set to the dock to add this app in dock dock oc.fileextensions
string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions
string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config
dict dictionary of resources (see resources details) { 'shm_size': '1g' } Example for Firefox application
LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
"},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
Read the dedicated chapter for resource description, to get more informations on host_config
"},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"To download an abcdesktop docker image, run the command
docker pull abcdesktopio/firefox.d\n
To inspect the labels in the docker image, run docker inspect
docker inspect abcdesktopio/firefox.d:latest\n
Read the labels section :
\"Labels\": {\n \"architecture\": \"x86_64\",\n \"oc.cat\": \"office\",\n \"oc.desktopfile\": \"firefox.desktop\",\n \"oc.displayname\": \"Firefox\",\n \"oc.fileextensions\": \"htm;html;xml;gif\",\n \"oc.icon\": \"firefox.svg\",\n \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n \"oc.keyword\": \"firefox,mozilla,web,internet\",\n \"oc.launch\": \"Navigator.Firefox\",\n \"oc.legacyfileextensions\": \"htm;html;xml\",\n \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"oc.name\": \"Firefox\",\n \"oc.path\": \"/usr/bin/firefox\",\n \"oc.showinview\": \"dock\",\n \"oc.template\": \"oc.template.gtk.firefox\",\n \"oc.type\": \"app\",\n \"oc.usedefaultapplication\": \"true\",\n \"release\": \"5\",\n \"vcs-ref\": \"master\",\n \"vcs-type\": \"git\",\n \"version\": \"1.2\"\n }\n
"},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"All abcdesktop applications use by default the oc.template.gtk images name.
"},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"By default, oc.templace.gtk
is the main image for all applications. For example oc.template.gtk.firefox
use the oc.template.gtk
image. oc.template.gtk.firefox.acme
use the oc.template.gtk.firefox
.
oc.template.gtk.firefox
contains the Mozilla Firefox application.oc.template.gtk.firefox.acme
may contain custom set for Mozilla Firefox application, like Root CA, proxy values or policy.json files for the acme.+------------------------------+\n|oc.template.gtk.firefox.acme |\n+---------------+--------------+\n |\n |\n+---------------+--------------+\n|oc.template.gtk.firefox |\n+---------------+--------------+\n |\n |\n+---------------+--------------+\n|oc.template.gtk |\n+---------------+--------------+\n
"},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"Run, the user is connected to his own POD (or container)
The service infrastructure is based on :
The user creates a pod user
"},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"pyos
is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :
When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.
"},{"location":"architecture/#nginx","title":"nginx","text":"nginx
container act as web server and websocket reverse proxy.
mongo
is used by pyos to store user profil informations. The profil informations are :
memcache
stores progress text message information during login process. memcache
datas are set and get only by the control plane.
oc.user
is the name of the user's container image. oc.user
runs the X11 graphical service. oc.user
is based on ubuntu distribution.
abcdesktopio/oc.user.ubuntu:3.0
is based on ubuntu
distribution 22.04
. Get more details about oc.user image.All applications are containers or pods, and share a graphical socket with the user's container
"},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"abcdesktop can run Microsoft Windows applications using Wine.
"},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded inoc.template.gtk.wine
image","text":"To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.
Start pulling this template image, if you don't have already done in the previous exercice :
docker pull abcdesktopio/oc.template.gtk.wine\n
This image embeded the architecture format win32
win64
. By default the WINEARCH
is set to win32
. The playonlinux
package is all ready installed.
homedirectorytype
option","text":"To share the home directory /home/balloon
volume data between containers, set the desktop.homedirectorytype
to 'volume'
in your od.config file.
Edit your own od.config
file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype
is set to 'volume'
desktop.homedirectorytype: 'volume' \n
If need, run the docker-compose restart
command in your abcdesktop directory where the od.config
and the docker-compose.yml
are located.
docker-compose restart\n
"},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.
PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.
Start an abcdesktop session. You can use an authenticated session using an authentication provider external
or explicit
, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit
.
In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.
Login using the Anonymous
authentification provider.
Click on the menu and choose settings options
On the Settings
dialog box, choose System
option
Choose the User container
tabs, and select the hostname
value.
Copy this value into your clipboard. The hostname use the docker containerid
value.
Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.
Run the docker inspect -f \"{{ .HostConfig.Binds }}\"
and add your CONTAINER ID
as parameter.
CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n
where CONTAINER_ID is your own containerid
value.
For example
docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n
You should read the volume name starting by the prefix tmp-
with your uuid value, and a second volume name starting by the prefix home-
with your uuid:
[tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n
We are using the /tmp
volume and the /home/balloon
volume of your container.
If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf
. The name of the tmp
volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf
and the name of tmp
volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf
If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes
. The name of the tmp
volume is tmp-hermes
and the name of tmp
volume is home-hermes
.
Replace in the command the string TMP_VOLUMENAME
by your own tmp volume name.
Replace in the command the string HOME_VOLUMENAME
by your own home volume name.
docker run -it -v TMP_VOLUMENAME:/tmp -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n
For example with an anonymous user:
docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n
Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp
. You get a prompt inside the new docker container.
To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n
Init the wine directory
wineboot --init\n
After few seconds you should read on the standard error
0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n
And now download putty.exe from the web site https://www.putty.org/.
In this example, we use the 64 bits binary format
balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
Start the putty.exe
with wine, with the command wine putty.exe
balloon@5719b77d3f2a:~$ wine putty.exe\n
After few seconds you should read on the standard error
0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n
The wine prefix is WINEPREFIX=/composer/.wine
, all files used by wine are stored in /composer/.wine
directory.
On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :
You can use this Putty Windows application to connect to another host using ssh
or telnet
protocol.
The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell
Click on the Web Shell
icon, a new Terminal WebShell is now opened :
Run the command to list each X11 windows and get the WMClass name.
wmctrl -lx \n
Read the WM_CLASS of the Putty Wine application: putty.exe.Wine
Then exit the web shell
and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine
.
In this chapter we are going to build a new docker image for abcdesktop
The new image is the putty.
Create a directory named build
, and create a directory icons
inside build
mkdir build\nmkdir build/icons\ncd build\n
To build your own json file.
Create a json file named applist.json
, inside build directory, and add the content to the json file.
[\n{\n \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n \"preruncommands\": [ \n \"ENV WINEARCH=win64\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.exe.Wine\",\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine\",\n \"path\": \"/usr/bin/wine\"\n}\n]\n
To fill the data inside the json file :
name Type Datacat
string utilities icon
string putty.svg keyword
string putty,ssh,terminal launch
string putty.exe.Wine name
string putty path
string /usr/bin/wine args
string /composer/bin/putty.exe template
string abcdesktopio/oc.template.gtk.wine You can read the following help lines.
cat
is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
icon
is the name of the icon. abcdesktop support only svg
icon file format. To get the icon file, look at the link https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svgkeyword
is a list of the keywords to find the application. Set the value to putty,ssh,terminal
.launch
is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below). name
is the name of the application. Set the value to putty.path
is the binary path to run the application. template
is the name of the parent image. The default image parent for wine is abcdesktopio/oc.template.gtk.wine
. Save the putty icon file on SVG format to the icons directory.
wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
"},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json
","text":"To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.
Save make.js
it to you build directory. make.js
is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.
If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n
In the build directory, you should have
drwxr-xr-x 5 devuser staff 160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser staff 992 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 497 Mar 11 15:15 applist.json\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 icons\n-rw-r--r-- 1 devuser staff 6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 .\ndrwxr-xr-x 5 devuser staff 160 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 1909 Oct 31 2015 putty.svg\n
Run the command make.js
node make.js\n
make.js
build a new DockerFile for putty
application. Remember, all application images use container images.
You should get the output
{\n template: 'abcdesktopio/oc.template.gtk.wine',\n preruncommands: [\n 'ENV WINEARCH=win64',\n 'USER $BUSER',\n 'RUN wineboot --init',\n 'RUN echo disable > $WINEPREFIX/.update-timestamp', \n 'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n ],\n args: '/composer/bin/putty.exe',\n cat: 'utilities',\n debpackage: '',\n icon: 'putty.svg',\n keyword: 'putty,ssh,terminal',\n launch: 'putty.exe.Wine',\n name: 'putty-wine',\n displayname: 'Putty Wine',\n path: '/usr/bin/wine'\n}\n
The new files putty-wine.d
has been generated :
putty-wine.d
is the Dockerfile for your putty abcdesktop applicationRead the content of the Dockerfile putty-wine.d
. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.
Now it's time to build your putty app. Run the command docker build
command.
docker build --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n
You should read on the standard ouput
[+] Building 21.6s (10/10) FINISHED \n => [internal] load build definition from putty-wine.d 0.0s\n => => transferring dockerfile: 12.46kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev 0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev 0.0s\n => [2/6] RUN wineboot --init 10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe 0.6s \n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 9.2s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.4s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 0.4s \n => => exporting layers 0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd 0.0s \n => => naming to docker.io/library/putty-wine.d 0.0s\n
Now, your new image is ready to run.
"},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.
Using your web browser or a curl command, call a http request to notify the API Server
http://localhost/API/manager/buildapplist\n
This http request return a json object, with all docker images details :
Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.
In the search area, type putty
. Click on the Putty
Application.
Wine is starting your Putty
application :
Great, you have build a abcdesktop image for Putty
, build the application image Putty
. You can push this image to your own private docker registry.
user.reg
and system.reg
windows registry files","text":"This is a quick and dirty solution, but it works fine
Your wine configuration is stored in /composer/.wine
, and by default user.reg
and system.reg
are located in the WINEPREFIX
directory. The user.reg
and system.reg
files build when wine starts.
To make a copy of fresh running putty-wine.d
image. Start your putty-wine.d
image and using a shell located the new user.reg
and system.reg
files
docker ps -a | grep putty-wine\n65d95f4e7717 putty-wine.d:latest \"/composer/appli-doc\u2026\" 16 seconds ago Up 15 seconds anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n
Then copy files using the docker cp
command
CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n
Add them to your default putty-wine.d
image using applist.json file :
[\n{\n \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n \"preruncommands\": [ \n \"ENV WINEARCH=win64\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.exe.Wine\",\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine\",\n \"path\": \"/usr/bin/wine\"\n}\n]\n
Rebuild your Dockerfile
node make.js\n
{\n template: 'abcdesktopio/oc.template.gtk.wine',\n preruncommands: [\n 'ENV WINEARCH=win64',\n 'USER $BUSER',\n 'RUN wineboot --init',\n 'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n 'RUN echo disable > $WINEPREFIX/.update-timestamp',\n 'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n ],\n args: '/composer/bin/putty.exe',\n cat: 'utilities',\n debpackage: '',\n icon: 'putty.svg',\n keyword: 'putty,ssh,terminal',\n launch: 'putty.exe.Wine',\n name: 'putty-wine',\n displayname: 'Putty Wine',\n path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n
Run the command docker build
command.
docker build --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n
Now your wine keep your registry's updates.
"},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"abcdesktop use docker image format with some labels to describe the application.
"},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":"lmdpocpetit
, but this value may have been changed.In this chapter we are going to build a new docker image for abcdesktop
The new image is the game 2048.
Create a directory named build
, and create a directory icons
inside build
mkdir build\nmkdir build/icons\ncd build\n
To build your own image create first a json file.
Create a json file named applist.json
, inside build directory, and add the content to the json file.
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n }\n]\n
To fill the data inside the json file :
name Type Datacat
string games debpackage
string 2048-qt icon
string 2048_logo.svg keyword
string 2048 launch
string 2048-qt.2048-qt name
string 2048 path
string /usr/games/2048-qt template
string abcdesktopio/oc.template.gtk You can read the following help lines, or fill the json missing value by yourself.
cat
is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]debpackage
is the name of the 2048 ubuntu package. To find the package name, look at the link 2048 Ubuntu Package.icon
is the name of the icon. abcdesktop support only svg
icon file format. To get the icon file, look at the link https://upload.wikimedia.org/wikipedia/commons/1/18/2048_logo.svgkeyword
is a list of the keywords to find the application. Set the value to 2048.launch
is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below). name
is the name of the application. Set the value to 2048.path
is the binary path to run the application. template
is the name of the parent image. The default image parent is abcdesktopio/oc.template.gtk
. You will learn how to customize your own template image, in next chapter. Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons
command :
2048_logo.svg\n
"},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.
Save make.js
it to you build directory. make.js
is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.
If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.
In the build directory, you should have
drwxr-xr-x 5 devuser staff 160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser staff 992 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 265 Mar 11 15:15 applist.json\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 img\n-rw-r--r-- 1 devuser staff 8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 .\ndrwxr-xr-x 5 devuser staff 160 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 1909 Oct 31 2015 2048_logo.svg\n
Run the command make.js
node make.js\n
make.js
build a new DockerFile for the 2048 application. Remember, all application images use container images.
You should get the output
{\n cat: 'games',\n debpackage: '2048-qt',\n icon: '2048_logo.svg',\n keyword: '2048',\n launch: '2048-qt.2048-qt',\n name: '2048',\n displayname: '2048',\n path: '/usr/games/2048-qt',\n template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n cat: 'games',\n debpackage: '2048-qt',\n icon: '2048_logo.svg',\n keyword: '2048',\n launch: '2048-qt.2048-qt',\n name: '2048',\n displayname: '2048',\n path: '/usr/games/2048-qt',\n template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n - '2048' : '2048.md'\n
The new files 2048.d
and 2048.md
have been generated :
2048.d
is the Dockerfile for your 2048 abcdesktop application2048.md
is the documentation file for your 2048 abcdesktop applicationRead the content of the Dockerfile 2048.d
. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.
Now it's time to build your 2048 app. Run the command docker build
command.
docker build --build-arg TAG=latest -f 2048.d -t 2048.d .\n
You should read the output :
[+] Building 32.0s (10/10) FINISHED \n => [internal] load build definition from 2048.d 0.0s\n => => transferring dockerfile: 33B 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends 2048-qt && apt-get clean 27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.5s\n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.5s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.4s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 1.1s \n => => exporting layers 1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a 0.0s\n => => naming to docker.io/library/2048.d\n
Check that your image is ready on your system:
Run the docker images command
docker images\n
You should read on the stdout more lines, only 2048.d is listed here :
REPOSITORY TAG IMAGE ID CREATED SIZE\n2048.d latest a861af06b7f0 About a minute ago 1.17GB\n
The total image size of 2048.d is 1.17GB.
The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk
.
The API server receives a new image event from docker. To run the new applications just refresh you web browser page.
"},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"Return to your abcdesktop website http://localhost
and log in as Anonymous.
At the right corner, write in the search bar the keyword 2048
Click on the 2048
icon, and start your first abcdesktop application :
Great it's a good job, you have build your own abcdesktop 2048 application.
Now you can spent a lot of time to reach the 2048 score. Have fun !
"},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Getlaunch
and path
values","text":"To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.
If you want to use abcdesktop as a GNU/Linux host
Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch
and path
.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right corner, write in the search bar the keyword shell
Click on the Web Shell
icon, a new Terminal WebShell is now opened :
Run the command
sudo apt-get update \n
The default password is lmdpocpetit
( if your admin did not change it, otherwise ask to the administrator )
Run the installation command
sudo apt-get install -y 2048-qt \n
You should read the output, during the installation process
On Ubuntu, the games are installed in a dedicated directory /usr/games
.
Read the file list of the 2048-qt Ubuntu package
/usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n
Start the 2048 game binary 2048-qt
in background.
/usr/games/2048-qt & \n
The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.
Run the command to list each X11 windows and get the WMClass name.
wmctrl -lx \n
wmctrl
is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.
-l
list the windows being managed by the window manager. -x
include WM_CLASS in the window listGreat, look at the third value, this is what we are looking for :
launch
is 2048-qt.2048-qt
path
is /usr/games/2048-qt
You can now close your web browser and fill your json file, by yourself
"},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.
By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.
New applist.json data, and build your own Gimp abcdesktop.io application.
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n },\n {\n \"cat\": \"\",\n \"debpackage\": \"\",\n \"icon\": \"\",\n \"keyword\": \"\",\n \"launch\": \"t\",\n \"name\": \"\",\n \"displayname\": \"\",\n \"path\": \"\",\n \"template\": \"\"\n }\n\n]\n
You should get data entries like:
gimp.Gimp
/usr/bin/gimp
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n },\n {\n \"cat\": \"graphics\",\n \"debpackage\": \"gimp\",\n \"icon\": \"gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n }\n\n]\n
"},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.
\"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\":\"dds\",\n \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n
These entries allow user to use the file manager choice Open with
and Open with Other Application
and list Recommended Applications
The Gimp Json data shows
{\n \"cat\": \"graphics\",\n \"debpackage\": \"gimp\",\n \"icon\": \"gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\":\"dds\",\n \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n
Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.
"},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"musl versus glibc
"},{"location":"changelog/","title":"abcdesktop change log","text":"Logs of all notable changes made to abcdesktop.io
"},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":"WEBSOCKIFY_HEARTBEAT
in od.config file OR use proxy-read-timeout
and proxy-send-timeout
annotations to kind: Ingress
--heartbeat=${WEBSOCKIFY_HEARTBEAT}
to /usr/bin/websockify to keep sessionClusterRole
to role
-- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442
"},{"location":"faq/","title":"FAQ","text":"List of questions and answers relating to abcdesktop.io
A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.
"},{"location":"faq/#networking","title":"Networking","text":"This list of questions and answers is relating network, talking about
I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?
We use the kubectl port-forward
to the nginx pod
NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n
Then open your web browser to reach the http://localhost
Then open your web browser, you get the home page, login using LDAP auth
or Anonymous auth
.
Then login, and you get a pod user.
For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.
"},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?
To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort
, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer
.
Delete the previous abcdesktop's nginx service
kubectl delete service nginx -n abcdesktop\n
Create a new nginx service yaml file named nginx-lb.yaml
The new nginx service type is LoadBalancer
kind: Service\napiVersion: v1\nmetadata:\n name: nginx\n namespace: abcdesktop\nspec:\n type: LoadBalancer\n selector:\n run: nginx-od\n ports:\n - protocol: TCP\n port: 80\n targetPort: 80\n name: http\n
Apply the nginx service type LoadBalancer
kubectl apply -f nginx-lb.yaml\nservice/nginx created\n
Wait for an EXTERNAL-IP
from you kubernetes cloud provider
kubectl get service nginx -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.105.75 <pending> 80:31581/TCP 64s\n
You get the EXTERNAL-IP
for your LoadBalancer
kubectl get service nginx -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.172.53 161.35.246.4 80:30443/TCP 2m36s\n
In case, the LoadBalancer
service returns the EXTERNAL-IP
161.35.246.4 Then open your web browser to reach this EXTERNAL-IP
161.35.246.4.
Login using Philip J. Fry
And you should get the fry
desktop
A Kubernetes Ingress Controller acts as a reverse proxy.
In the Ingress
, define a path to the abcdesktop's nginx service.
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: ingress-demo\n namespace: abcdesktop\nspec:\n rules:\n - host: demo.digital.pepins.net\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: nginx\n port:\n number: 80\n ingressClassName: nginx\n
The request path: /
is proxyfied to service named nginx in abcdesktop namespace.
My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.
The message Your abcdesktop session has been disconnected. Please reload this page
appears when the websockify
websocket is disconnected.
Add an heartbeat value to send a ping to the client every INTERVAL seconds
Edit the od.config
file, add to the desktop.envlocal
option 'WEBSOCKIFY_HEARTBEAT':'30'
desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n
In this case, the command /usr/bin/websockify
sends a ping to the client every 30 seconds. This command runs in the user's pod.
Update the configmap abcdesktop-config
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart the pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
To get more informations how to Keepalive in websockets
Timeout is a main feature to preserve from unnecessary network bandwidth.
"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.
To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.
Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout
and nginx.ingress.kubernetes.io/proxy-send-timeout
annotations to more than 60 seconds.
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: ingress-demo\n namespace: abcdesktop\n annotations:\n nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n rules:\n - host: demo.digital.pepins.net\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: nginx\n port:\n number: 80\n ingressClassName: nginx\n
"},{"location":"faq/#applications","title":"Applications","text":"This list of questions and answers is relating abcdesktop's applications, talking about
/API/manager/images
endpointsTo delete all applications use the images endpoint, replace localhost:30443
by your own datas
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n
It returns a json list of all deleted applications
[\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
"},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n
The first start will pull the 2048 image, so it can take a while.
"},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"To get the json file of a containerized application, you can use docker
command or crictl
command
docker
commanddocker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
crictl
commandcrictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
"},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"Open the webshell
and read the logs files.
The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.
/tmp/lastcmd.log
the init command log file created by /composer/appli-docker-entrypoint.sh/tmp/lastcmdenv.log
the last environment variables file/tmp/NAME OF THE APPLICATION.log
the command log file for the applicationA lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :
https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.
https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.
HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.
https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.
Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.
https://www.kasmweb.com Streaming containerized apps and desktops.
Docker and Wine Docker image that includes Wine and Winetricks for running Windows applications on Linux and macOS
In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]
"},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.
We can approach this problem from three angles:
"},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":"we can share the X11 server socket with the X11 client container as unix file socket on an external shared volume. Applications and X11 server run in dedicated containers.
we can share the X11 server socket with the container using TCP. X11 uses TCP as its transport protocol. Applications and X11 server run in dedicated containers.
To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.
The unix file socket reduce the network tcp overhead.
The unix file socket garantes no latency troubleshooting. X11 uses a chatty protocol so that the network latency has a large impact when using X11
Local is best, thus server and application need to run on the same node, if it can.
"},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remoteDISPLAY
","text":"The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY
in a <canvas>
HTML element.
Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen
rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.
The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :
websockify Websockify just translates WebSockets traffic to normal socket traffic. Websockify accepts the WebSockets handshake, parses it, and then begins forwarding traffic between the client and the target in both directions.
ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.
The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.
abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.
"},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"An application can run as ephemeral container or as pod.
"},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":"nginx
: container act as static web server and reverse proxy routerpyos
: container abcdesktop core control planememcached
: container cache servicemongo
: container database service to store user profil datauser
: pod user, one pod per connected userapplications
: each graphical application runs inside a dedicated container. You need to create an container image for each applicationapplication helper
for a web browser. By example, firefox
container can ask to start videolan
application. Then firefox
is running inside a container, videolan
is running inside another separated container. /dev/shm
between X.org and application is supported with the ephemeral container.Privacy Notice: protecting your personal data
The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.
If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.
In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.
This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.
This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.
Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.
We only process your personal data once we have your consent in the context of you request.
Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.
What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.
Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.
Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.
What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.
How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:
Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15
Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.
How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.
For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.
Modification of the personal data protection notice This Privacy Notice is subject to change.
"},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":"x86-64
( arm-64
is not yet available)Our images support only architectures x86-64
. The architectures supported by this image is:
arm-64
is in progress.
The recommended distrubution is Ubuntu 22.04.2 LTS
Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/
"},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/
"},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":"Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.
To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50
Start pulling this template image :
docker pull abcdesktopio/oc.template.gtk.wine\n
Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine
on the https://hub.docker.com/ web site.
For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine
is created.
Dockerfile information :
dpkg --add-architecture i386
aptitude install -y wine
In this chapter we are going to run notepad.exe
for Windows inside a docker container for abcdesktop.io.
Start an abcdesktop session. You can use an authenticated session using an authentication provider external
or explicit
, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit
.
In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.
Login using the Anonymous
authentification provider.
Keep your web browser open, then on your host, open a terminal shell window and run the command
docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n
The option --filter ancestor=abcdesktopio/oc.user.18.04
ask to filter only container with the image ancestor
set with value abcdesktopio/oc.user.18.04
You should read the container with the image named abcdesktopio/oc.user.18.04
docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n86df3ff126ac abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 3 minutes ago Up 3 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n
Read the values CONTAINER ID
and NAMES
In this example, the CONTAINER ID is 86df3ff126ac
and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138
.
We are using the /tmp
volume of this CONTAINER ID
86df3ff126ac
Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be
. The name of the tmp
volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be
Run a docker inspect -f \"{{ .HostConfig.Binds }}\"
and add your CONTAINER ID
as parameter.
docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n
For example
docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n
You should read the volume name starting by tmp-
with your uuid concatened
[tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n
Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes
. The name of the tmp
volume is tmp-hermes
Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v
parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"
docker run -it -v TMP_VOLUMENAME:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash\n
For example with an Anonymous
user:
docker run -it -v tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n
Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp
. You get a prompt inside the new docker container.
To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n
And now start the notepad.exe
with wine
balloon@8684ae888f74:/$ wine notepad\n
After few seconds you should read on the standard error
balloon@8684ae888f74:/$ wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n
And the notepad window should be open inside your Web browser
This Windows application is running inside a docker container on abcdesktop.io desktop.
In the Terminal shell press CTRL+C
to stop the wine notepad
process, then type exit
to quit your shell in container.
^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n
It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.
"},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"The abcdesktop release 1.0 has started in May 2015
All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"The authentification configuration is set in the od.config
file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.
Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.
"},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"The authmanagers is defined as a dictionnary object :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
The od.config defines 3 kinds of entries in the authmanagers
object :
external
: use for OAuth 2.0 Authentificationexplicit
: use for LDAP, LDAPS and ActiveDirectory Authentificationimplicit
: use for Anonymous Authentificationexternal
OAuth 2.0 Authentification explicit
LDAP, LDAPS and Active Directory Authentification implicit
Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"You should have read the hands-on :
Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit
, explicit
, and external
, as describe :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
Save your new od.config file.
The config file od.config
has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.
docker-compose restart
Start your web browser and open the URL http://localhost
The Web home page should only show the title abcdesktop.io. There is no authmanagers
available.
Great you can now add some value to authenticate your users.
"},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagersimplicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.
explicit
:","text":"explicit
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.
external
:","text":"external
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.
In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers
dictionnary as described for example :
authmanagers: {\n 'external': {\n 'providers': {\n 'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'client_id': 'XXXXXXX', \n 'client_secret': 'YYYYYYY', \n 'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n 'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n },\n 'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'client_id': 'AAAAAAAA', \n 'client_secret': 'BBBBBBBB',\n 'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n 'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n 'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n },\n 'mobileorange': { \n 'displayname': 'Mobile Connect', \n 'enabled': False,\n 'client_id': 'CCCCCCCC', \n 'client_secret': 'DDDDDDDD',\n 'basic_auth': True,\n 'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n 'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n 'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n },\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'EEEEEEEE.apps.googleusercontent.com', \n 'client_secret': 'FFFFFFFF',\n 'scope': 'https://www.googleapis.com/auth/userinfo.email',\n 'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n 'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n 'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n }\n }\n },\n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n }}\n\n\nadconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.1.12', '192.168.1.13' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True\n}}\n
"},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"1.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string not used by ldap, only used by Active Directory providers
dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref
.
Providers :
The provider is formated as a dictionnary
{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The ldapconfig is a dictionnary.
For example :
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ '192.168.8.195' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n\n}\n
"},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this domain as default domain True ldap_protocol
string protocol type. ldap
or ldaps
for LDAP directory services ldap
tls_require_cert
boolean The default value is False. tls_require_cert
apply only if ldap_protocol
is set to ldaps
. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True
This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
False basedn
string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ]
IP Address or FQDN values scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"You should have all read and done the hands-on :
To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.
Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing
"},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"Update the docker-compose.yml
file to add an ldap as directory server
The specific openldap
section is describe as a service. The new complete docker-compose.yml
file is now :
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'abcdesktopio/oc.nginx'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\n openldap:\n image: abcdesktopio/oc.openldap\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
"},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config
configuration file","text":"Update the od.config
configuration file.
Add the explicit
entry to the dictionary authmanagers
.
authmanagers: {\n 'external': {\n },\n 'explicit': {\n 'show_domains': True,\n 'providers': {\n 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n }}\n\n\n
Note: the config_ref
is ldapconfig
.
Add a new dictionnary object named ldapconfig
to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'openldap' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n
Note: the server name is the name of the service entry
Save your new od.config file.
The config file od.config
has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.
docker-compose restart
Open the URL:http://localhost
The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"1.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
The explicit
authentification support the directory services ldap
, ldaps
, and Microsoft Active Directory
.
Configuration sample for Microsoft Active Directory
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
"},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers
"},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"1.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'XXX',\n 'client_secret': 'YYY',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n }\n
"},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"Facebook's OAuth is supported for authentication.
"},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'XXX', \n 'client_secret': 'YYY', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n
"},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"1.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionnary object and contains an anononymous
provider.
anononymous
provider always permit authentification, and create a uuid as userid. anononymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anononymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers dictionnary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Press the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command docker ps -a
docker ps -a\n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When the anonymous container is removed, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
Controller DescriptionAccountingController
accounting data json and ebnf format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, runApplication) CoreController
get configuration and user message info ManagerController
manage pyos PrinterController
CRUD printer object StoreController
CRUD key value data UserController
retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"The AccountingController
and ManagerController
access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller
name and with an entry permitip
. The permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or the controller
name is not set, all ip source address are allowed the send a request to the controller.
The controllers
dictionnary is defined in the od.config
file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.
By default others controllers access is enabled, without ip restriction.
controllers : { \n 'AccountingController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'ManagerController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'PrinterController' : { 'permitip': None },\n 'StoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n } \n
If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.
In Kubenetes Mode: Read the setup guide, to make change in the abcdesktop yaml file. Setup and configuration guide for kubernetes abcdesktop
In Docker Mode : Read the following chapter
This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.
"},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":"docker-compose
command ready to runCreate a directotry named abcdesktop
in your home directory.
cd\nmkdir -p abcdesktop\n
To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config
where docker-compose.yml file is located.
Download sample configuration file od.config then rename the od.config.reference
file as od.config
docker-compose down\n
You should read on the standart output
Removing open_nginx_1 ... done\nRemoving open_pyos_1 ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1 ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
"},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml
","text":"Edit your docker-compose.yml
to add a volumes entry to pyos services
Example : My working directory is /home/alex/abcdesktop
Add the new entry in volumes
volumes:\n - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n
For example, the docker-compose.yml
contains
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'abcdesktopio/oc.nginx'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
"},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"Now, it's time to make a change in your od.config file.
Download the od.config file and save it to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
Change the defaultbackgroundcolors in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local oc.config file.
Run your docker-compose
To restart your docker-compose, run the command
docker-compose up\n
When the od.config change, od.py reload this configuration file automatically.
You should read at the standard ouput of docker-compose
Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1 ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1 ... done\nStarting abcdesktop_pyos_1 ... done\nStarting abcdesktop_nginx_1 ... done\n[ lines cut here ]\n
"},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colors and you should have it as background color :
Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.
"},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"Click on the Docker icon in MacOS/X menu bar.
Then choose Preferences...
The following window should appear :
Choose Kubernetes
, then check the Enable Kubernetes
Kubernetes stay in Starting
state during few minutes. Please wait to download all container images and for kubernetes installation process.
On the bottom you should read next Docker Running
Kubernetes Running
Great, you have installed Kubernetes on MacOS/X.
"},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the newkubectl
command","text":"Open a Terminal, then run the command kubectl version
% kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n
Run the command kubectl get pods
% kubectl get pods\nNo resources found.\n
Great, the kubectl command works. It's time to deploy abcdesktop.io
"},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"Click on the Docker Desktop
icon in the windows tray.
The following menu should appear, choose Settings
:
The following window should appear :
Choose Kubernetes
, then check the Enable Kubernetes
Press the Apply and Restart
button. Please wait to download all container images and for kubernetes installation process.
On the bottom you should read next Docker Running
and Kubernetes Running
.
Great, you have installed Kubernetes on Windows 10.
"},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the newkubectl
command","text":"Open a Terminal cmd.exe
, then run the command kubectl version
Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n
Run the command kubectl get pods
kubectl get pods\nNo resources found.\n
Great, the kubectl command works. It's time to deploy abcdesktop.io
"},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.
Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.
To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.
"},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"Here are officials available encryption providers (Kubernetes Official page ):
Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther Considerationsidentity
NoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbc
AES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox
.secretbox
XSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcm
AES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kms
Uses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user. aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider
"},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"In /etc/kubernetes
directory, create a directory named aescbc:
sudo mkdir /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"Create aescbc yaml configuration file:
sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n - resources:\n - secrets\n providers:\n - aescbc:\n keys:\n - name: key1\n secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n - identity: {}\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"Secret key can be generated using the following command:
head -c 32 /dev/urandom | base64\n
In encrypt_config.yaml, replace secret for key1 in aescbc.keys section
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:
sudo chmod -R 600 /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"Edit kube-apiserver.yaml
configuration file:
vim /etc/kubernetes/manifests/kube-apiserver.yaml\n
In spec.containers.command section add:
- --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n
In spec.containers.volumeMounts section add:
- mountPath: /etc/kubernetes/aescbc\n name: aescbc-config\n readOnly: true\n
In spec.volumes section add:
- hostPath:\n path: /etc/kubernetes/aescbc\n type: DirectoryOrCreate\n name: aescbc-config\n
save the file
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:
kubectl -n kube-system get pods\n
NAME READY STATUS RESTARTS AGE\ncoredns-66bff467f8-69b8r 1/1 Running 0 21h\ncoredns-66bff467f8-74j9n 1/1 Running 0 21h\netcd-cube05 1/1 Running 0 21h\nkube-apiserver-cube05 1/1 Running 0 6s\nkube-controller-manager-cube05 1/1 Running 1 21h\nkube-flannel-ds-amd64-p9xhq 1/1 Running 0 20h\nkube-proxy-8xk5g 1/1 Running 0 21h\nkube-scheduler-cube05 1/1 Running 1 21h\n
At this state, all created secrets will be crypted in etcd
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"sudo kubectl -n default describe secret secret1\n
Name: secret1\nNamespace: default\nLabels: <none>\nAnnotations: <none>\n\nType: Opaque\n\nData\n====\nmykey: 6 bytes\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"To verify secret encryption we will install etcd client package
apt-get install etcd-client\n
Run the following command:
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n
Output will appear with the following text k8s:enc:aescbc:v1:key1:
followed by binary values.
Secrets are now encoded with aescbc v1 provider using key1
"},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:
"},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.
"},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:
Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.
docker volume create myshared \n
"},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.
Note: We do not need the default 5900 VNC tcp port any more.
docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n
You should see a prompt like :
root@6de36e574877:/#\n
Install the package wget Install the library files for tigervnc.
Package list:
Those packages are used by tigervnc. We need to install them.
apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n
Download the last tigervnc X11 graphics server from the bintray.com web site
wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n
Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system
cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n
Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section
Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n
You should read the output
Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar 3 11:05:48 2020\n vncext: VNC extension running!\n vncext: Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext: created VNC server for screen 0\n
Check that the Xvnc TigerVNC release is 1.10.0.
Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.
"},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.
ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.
Before, install the package gcc g++ make curl
apt-get install -y gcc g++ make curl \n
Install nodejs and npm
curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
apt-get install -y nodejs\n
Install ws-tcp-bridge
npm install ws-tcp-bridge -g\n
Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background
Add the &
at the end of the command line to run this process in background
/usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n
You should read on the standard output
proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n
Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket
"},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"On the container myx11server, to get the container local IP Address, install the package net-tools package
apt-get install -y net-tools\n
And run the ifconfig command
ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255\n ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)\n RX packets 65149 bytes 95569807 (95.5 MB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 20880 bytes 1159982 (1.1 MB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n
Write here the ip address of your container myx11server:
IP Address of myx11server _ . . _ .
"},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.
docker run -it --name mywebserver -p 80:80 ubuntu:latest\n
You should see a prompt like:
root@96df62a73e4f:/# \n
Install nginx webserver, run the command
apt-get update\napt-get install -y nginx-extras\n
Install the git and vim package, run the command
apt-get install -y git vim\n
Clone the novnc git on github.com, inside the nginx's root directory.
cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n
You should read on the standart output
Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n
Start the nginx web server
nginx\n
The web server nginx is running in backgound.
Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.
"},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"Install the ping command, run the command
apt-get install -y iputils-ping\n
Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address
ping -c 5 xxx.xxx.xxx.xxx\n
In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2
ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n
The container webserver should receive package from the myx11server container
"},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.
vim /etc/nginx/sites-enabled/default\n
In the server section, after the line location you should found :
location / {\n # First attempt to serve request as file, then\n # as directory, then fall back to displaying a 404.\n try_files $uri $uri/ =404;\n }\n
Add a /websockify route to proxyfied the websocket http request to your myx11server container.
location = /websockify {\n proxy_buffering off;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_pass http://XXX.XXX.XXX.XXX:6081/;\n }\n
You have to replace the line
proxy_pass http://XXX.XXX.XXX.XXX:6081/;\n
by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/
proxy_pass http://172.17.0.2:6081/;\n
The complete server section in the nginx file is for example
server {\n listen 80 default_server;\n listen [::]:80 default_server;\n\n # SSL configuration\n #\n # listen 443 ssl default_server;\n # listen [::]:443 ssl default_server;\n #\n # Note: You should disable gzip for SSL traffic.\n # See: https://bugs.debian.org/773332\n #\n # Read up on ssl_ciphers to ensure a secure configuration.\n # See: https://bugs.debian.org/765782\n #\n # Self signed certs generated by the ssl-cert package\n # Don't use them in a production server!\n #\n # include snippets/snakeoil.conf;\n\n root /var/www/html;\n\n # Add index.php to the list if you are using PHP\n index index.html index.htm index.nginx-debian.html;\n\n server_name _;\n\n location / {\n # First attempt to serve request as file, then\n # as directory, then fall back to displaying a 404.\n try_files $uri $uri/ =404;\n }\n\n location = /websockify {\n proxy_buffering off;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_pass http://172.17.0.2:6081/; # change this line \n }\n\n\n # pass PHP scripts to FastCGI server\n #\n #location ~ \\.php$ {\n # include snippets/fastcgi-php.conf;\n #\n # # With php-fpm (or other unix sockets):\n # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n # # With php-cgi (or other tcp sockets):\n # fastcgi_pass 127.0.0.1:9000;\n #}\n\n # deny access to .htaccess files, if Apache's document root\n # concurs with nginx's one\n #\n #location ~ /\\.ht {\n # deny all;\n #}\n}\n
Now, it's time to reload your nginx configuration, by running the command
nginx -s reload\n
"},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.
Go to the URL http://localhost or the ip address of your own server
In this exercice in use localhost
in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name
of your own server.
http://localhost\n
or
http://YOUR_SERVER_IP_ADDRESS\n
You should read the Welcome to nginx! message in your web browser
Go to the noVNC URL http://localhost/noVNC/vnc.html
http://localhost/noVNC/vnc.html\n
Remember, remplace localhost by your fully qualified domain name
if need
You should read the Welcome to nginx! message in your web browser
To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:
not checked
localhost
(or your host ip address where your contianers are running )80
/websockify
Then, press the Connect
Button
On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.
docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install libreoffice application, run the install libreoffice command in your mylibreoffice container.
apt-get update\napt-get install -y libreoffice\n
Run the soffice command to start Libreoffice
export DISPLAY=:0.0\nsoffice --writer\n
You should read the output
(soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n
On the web browser, the application Libreoffice Writer
should appear.
Type some text data like 'Hello, I am running inside a docker container'
"},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"To move, resize, close, the windows applications, we need a windows manager. abcdesktop
is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.
Run the install openbox command in your myx11server container.
apt-get install -y openbox\n
Set the DISPLAY environment variable to :0.0 and start openbox in background
export DISPLAY=:0.0\nopenbox &\n
Now, you can move the Libreoffice
windows. All windows are decorated.
Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice
Lot of application are ready to use for abcdesktop. All applications are opensource.
You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.
docker pull abcdesktopio/$APP.d\n
for example to download libreoffice calc, run the command
docker pull abcdesktopio/calc.d\n
Read the list of all applications on the application list page
"},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"Go to the abcdesktop directory (where the docker-compose.yml
is located), and run the bash commands :
echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\" | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n
Great, you have uninstalled abcdesktop in non-cluster hosts.
"},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.
"},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":"Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.
docker volume create myshared \n
"},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"Start the first graphical container named myx11server, forward the tcp port 5900 to the container.
docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n
You should see a prompt like :
root@6de36e574877:/#\n
Install the X11 graphics server tigervnc
apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n
Start the X11 graphics server tigervnc
Xvnc :0 -SecurityTypes=none &\n
You should read the output
Xvnc TigerVNC 1.7.0 - built Dec 5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar 2 11:43:56 2020\n vncext: VNC extension running!\n vncext: Listening for VNC connections on all interface(s), port 5900\n vncext: created VNC server for screen 0\n
Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.
We will use the host tcp port 5900 to connect VNC Client.
"},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/
Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.
Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.
This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue
button.
This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.
You need to confirm the uncrypted connection warning dialog box. Press the Continue button.
A black screen should appear :
Keep this VNC Client running, we will use this display to show our applications later.
"},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.
docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install standart application like xedit, xman or xeyes, install the package x11-apps.
Run those commands in your myx11server container.
apt-get update\napt-get install -y x11-apps\n
Set the DISPLAY environment variable to :0.0 and then start the xedit command.
export DISPLAY=:0.0\nxedit\n
On the VNC Viewer, the application xedit should appear.
Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.
"},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.
Run the install openbox command in your myx11server container.
apt-get install -y openbox\n
Set the DISPLAY environment variable to :0.0 and then start openbox.
export DISPLAY=:0.0\nopenbox\n
The Openbox message appear to the sdterr
Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n
Now, you can move the window xedit. The windows are decorated.
"},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"Activate the window shell with your myapp running container, and press CTRL+C
root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n
You can remove your docker container, to clean up your environment
docker rm myapp\n
"},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.
docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install firefox application, run the install firefox command in your myfirefox container.
apt-get update\napt-get install -y firefox\n
Run the firefox command
export DISPLAY=:0.0\nfirefox\n
You should read the output
\n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n
On the VNC Viewer, the application firefox should appear.
Check that firefox works and go to your favorite web site.
"},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared
Run the commands :
docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n
Keep the docker images ubuntu, we will use it in the next chapter
"},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"In the next chapter, we will replace the VNC Client by a web browser.
"},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"The abcdesktop release 2.0 has started in May 2020
All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"2.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionary object and contains an explicit
provider.
For example :
'explicit': {\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
default_domain
string set the default domain name, if user does not prefix the login by domain\\s. default_domain
is only used by Active Directory provider providers
dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref
.
The provider is formatted as a dictionary. Example for a provider
defined as planet
{ 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True \n }\n }\n
Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet'
, where key
is config_ref
and value
is the dictionary variable name. enable boolean True
to enable or False
to disable the provider configuration The ldapconfig
is a dictionary.
For example :
ldapconfig : { \n 'planet': { \n 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://192.168.8.195' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n } \n } \n}\n
"},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only
boolean Do not run ldap queries, only use to run authentication False auth_type
string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn
string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap
or ldaps
for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ]
LDAP server address IP Address or FQDN value scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
serviceaccount
dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }
or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }
"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"Ldap service account permits service account binding. A service account can be defined using clear text login
and password
data, or as file reference login
and password
starting by file://
.
login
starts by file://
, then pyos open the defined file to read login data.password
starts by file://
, then pyos open the defined file to read password data.The file reference file://
for login
and password
is used to read kubernetes secret file data.
To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.
Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing
"},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update theod.config
configuration file","text":"Update the od.config
configuration file.
Add the explicit
entry to the dictionary authmanagers
.
authmanagers: {\n 'external': {\n },\n 'explicit': {\n 'show_domains': True,\n 'providers': {\n 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n }} \n
Note: the config_ref
is ldapconfig
.
Add a new dictionary object named ldapconfig
to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing
ldapconfig : { 'planet': { \n 'default' : True, \n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap' ] }}\n
Save your new od.config file.
Open the URL:http://localhost:30443
The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"2.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionary object and contains an explicit
provider.
The explicit
provider support the directory services ldap
, ldaps
, and Microsoft Active Directory
, and SIMPLE
, NTLM
and KERBEROS
protocols.
Configuration sample for Microsoft Active Directory
with KERBEROS
protocol :
'explicit': {\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'KERBEROS'\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
"},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP explicit authmanagers
"},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"2.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'XXX',\n 'client_secret': 'YYY',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n }\n
"},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"Facebook's OAuth is supported for authentication.
"},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'XXX', \n 'client_secret': 'YYY', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n
"},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"2.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easiest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionary object and contains an anonymous
provider.
anonymous
provider always permits authentification, and create a uuid as userid. anonymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anonymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers
dictionary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Select the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command
kubectl get pods -n abcdesktop \n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When an anonymous user close his session, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"2.0/config/authmetaexplicit/","title":"Authentificationmetaexplicit
for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit
object","text":"The metaexplicit
authentification manager contains only one provider. The provider must be defined as metadirectory
.
'metaexplicit': {\n 'providers': {\n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description providers
dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}
"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory
provider configuration","text":"The metadirectory
provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref
.
A metadirectory
provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut
.
coporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } } \n
Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description
value to get the user's trusted domain.
For example :
description: AD\\john\n
Then pyos look for provider AD
configuration and process authentification on domain AD
The metadirectory
accounts can be disabled. The ldap attribut userAccountControl
is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE
set or not.
A service account must defined for a metadirectory
provider. The service account is used to bind the metadirectory.
metadirectory
provider and active directory user domain","text":"The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut
authmanagers: {\n #\n # define the meta explicit manager\n # This is the trusted external forest for the followed domain\n #\n 'metaexplicit': {\n 'providers': {\n # define the metadirectory provider\n # only one metadirectory provider is supported \n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True } \n }\n },\n\n # \n # define the Active Directory provider for each DOMAIN\n # define two domains in two disctinct forest with a trust relationship \n # \n 'explicit': { \n # define an Active Directory provider AD \n 'AD': { 'config_ref': 'adconfig', 'enabled': True },\n # define an Active Directory provider ANOTHER\n 'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True } \n }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': { 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'NTLM',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n 'ldap_basedn' : 'DC=another,DC=super,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.another.super.local',\n 'domain' : 'ANOTHER',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn' : 'ANOTHER.SUPER.LOCAL',\n 'servers' : [ 'ldap://192.168.10.12' ],\n 'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectory
support","text":"metadirectory
support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory
support isMemberOf
on foreign security principal.
The user's SID
of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.
The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )
To get more information about foreign security principal (FSP), read :
Foreign Security Principals Container
Active Directory: Foreign Security Principals and Special Identities
balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
Controller DescriptionAccountingController
accounting data json and ebnf format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, runApplication) CoreController
get configuration and user message info ManagerController
manage pyos PrinterController
CRUD printer object StoreController
CRUD key value data UserController
retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"The AccountingController
and ManagerController
access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller
name and with an entry permitip
. The permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or the controller
name is not set, all ip source address are allowed the send a request to the controller.
The controllers
dictionnary is defined in the od.config
file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.
By default others controllers access is enabled, without ip restriction.
controllers : { \n 'AccountingController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'ManagerController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'PrinterController' : { 'permitip': None },\n 'StoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n } \n
If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode
or in kubernetes mode
.
All desktop options are defined in od.config file. Desktop options start with the prefix desktop.
, then add the name of the option.
desktop.usex11unixsocket
boolean True desktop.defaultbackgroundcolors
list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype
string 'volume' desktop.remotehomedirectorytype
list [] desktop.persistentvolumeclaim
string None desktop.allowPrivilegeEscalation
boolean False desktop.securityopt
list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret
string None desktop.image
string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter
string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer
boolean False desktop.soundimage
string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer
boolean False desktop.usecontainerimage
boolean False desktop.initcontainerimage
string 'abcdesktopio/oc.busybox' desktop.envlocal
dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' }
desktop.nodeselector
dictionary {}
desktop.username
string 'balloon' desktop.userid
integer 4096 desktop.groupid
integer 4096 desktop.userhomedirectory
string '/home/balloon'
desktop.useinternalfqdn
boolean False desktop.uselocaltime
boolean False desktop.host_config
dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }
desktop.application_config
dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }
desktop.policies
dictionary { 'rules':{}, 'max_app_counter':5 }
desktop.webhookdict
dictionary { 'firewall': '192.168.7.1' }
"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"The desktop.usex11unixsocket
force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0
If this feature is enable: A container application need a the DISPLAY. The DISPLAY is in this case :0.0
. The container application and the oc.user container share the same volume /tmp
, and share the X11 unix socket is /tmp/.X11-unix/X0
.
If this feature is disable: A container application need a DISPLAY. The DISPLAY is :0.0
(don't think at IPADDRESS_OF_X11_SERVER:0.0
to protect X11 access control). The two containers share the same network stack by default. The X11 server NEED to listen to a TCP or UDP port.
You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.
TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.
Set the desktop.usex11unixsocket
value to True
in most case, and this should not be changed.
The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application
Value Description''
Use daemon\u2019s default. 'none'
Own private IPC namespace, with /dev/shm not mounted. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system\u2019s IPC namespace. If not specified, daemon default is used, which can either be 'private'
or 'shareable'
, depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.
Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.
If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".
Default value desktop.shareipcnamespace : 'shareable'
This option describes how the default home directory for user user ballon should be created :
None
: no dedicated volume is created, the oc.user container use a directory inside the container. All user data will be removed at logout.'volume'
: This value is only recommended in docker mode. 'volume'
option create a dedicated volume, the oc.user container and applications may share this volume. User home data are persistent.'persistentVolumeClaim'
: This value is only avalaible in kubernetes. PersistentVolumeClaim option use a persistentVolumeClaim to create the user home directory. The persistentVolumeClaim can be mapped to differents storage data (like NFS, iSCSI, RBD...). Read more about persistentVolumeClaim on the kubernetes.io website. You need the set the value of desktop.persistentvolumeclaim
or create a default Persistent Volume Claim named 'abcdesktop-pvc'
This value is only avalaible in kubernetes mode.
desktop.persistentvolumeclaim
is the name of the Persistent Volume Claim if the desktop.homedirectory
is set to 'persistentVolumeClaim'
. The PVC (Persistent Volume Claim) must exist.
Run the kubectl get pvc command
to list the persistent volume claim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nabcdesktop-pvc Bound abcdesktop-pv 5Gi RWO abcdesktop-standard 170d\n
"},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]
For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.
If desktop.remotehomedirectorytype
contains 'cifs' and if the authentification provider get homeDrive
and homeDirectory
attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive
value, and mounted to homeDirectory
.
The desktop.allowPrivilegeEscalation
option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.
The default value is False
You should only set desktop.allowPrivilegeEscalation
to run sudo
command.
In production this value MUST be set to False
The desktop.defaultbackgroundcolors
allow you to change the default background color.
The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]
The desktop.defaultbackgroundcolors
length can contain up to 8 entries. To see the color
Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
You should see the default background colors, for example :
"},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"The desktop.imagePullSecret
is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret
is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
"},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"The desktop.image
is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04
The desktop.printerimage
is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04
The desktop.useprintercontainer
is boolean, to use printer cupsd
service as an separated container. This value is only available in kubernetes mode. The default value is False
.
The desktop.soundimage
is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04
The desktop.usesoundcontainer
is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False
.
The desktop.useinitcontainer
is boolean, to use init container. The default value is False
. The code call the desktop.initcontainercommand
list .
The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.
/home/balloon
must belong to balloon
default user and balloon
default group.
The desktop.initcontainercommand
runs the command at init container. The default value is None
, the default type is list
.
desktop.initcontainercommand example :
desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n
This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096)
.
The desktop.initcontainerimage
is the name of the init container image. The default value is busybox
.
desktop.envlocal
is a dictionary. desktop.envlocal
contains a (key,value) added as environment variables to oc.user.
The default value is :
{ \n 'DISPLAY': ':0.0', \n 'USER': 'balloon', \n 'LIBOVERLAY_SCROLLBAR': '0',\n 'WINEARCH': 'win32',\n 'UBUNTU_MENUPROXY': '0',\n 'HOME': '/home/balloon',\n 'LOGNAME': 'balloon',\n 'PULSE_SERVER: '/tmp/.pulse.sock', \n 'CUPS_SERVER': '/tmp/.cups.sock' \n}\n
Add 'CUPS_SERVER: '/tmp/.cups.sock'
only if desktop.useprintercontainer
is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock'
only if desktop.usesoundcontainer
is True.
desktop.nodeselector
is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.
{ 'disktype': 'ssd' }\n
"},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"desktop.username
describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"desktop.userid
describes the uid
of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"desktop.groupid
describes the gid
of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
RUN groupadd --gid 4096 $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"desktop.userhomedirectory
describes the homedirectory
of the user created inside the oc.user container. The type of desktop.userhomedirectory
is string. The default value is /home/balloon
.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"The desktop.uselocaltime
is boolean, to use host value of /etc/localtime
. The default value is False
. If desktop.uselocaltime
is True, this add a volume mapping from host file /etc/localtime
to container file /etc/localtime
.
The desktop.policies
is a dictionary.
max_app_counter
limit applications counter, without checking the docker container status rules
rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }
acl
allow or denied desktop creation Example
desktop.policies: { 'rules':\n { 'volumes': \n { 'domainuser': \n { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n 'Mygroupteam': { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n } \n },\n 'acls' : {},\n 'max_app_counter' : 4 }\n
"},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config
Define how the application can be run, read host_config description page to get more informations
"},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config
Define how the oc.user container can be run, read host_config description page to get more informations
"},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"desktop.webhookdict is a dictionary to add key/value to the command create
and destroy
in rules objects.
WARNING desktop.desktopuseinternalfqdn
is an experimental feature, keep this value to False in production
desktop.desktopuseinternalfqdn
describes the content of the payload data in the JWT Desktop Token. The default value is False
.
Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False
the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True
the payload data in the JWT Desktop Token contains the FQDN of the user Pod.
If you CAN NOT add endpoint_pod_names
in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn
to False
. This choice is less secure.
To set desktop.desktopuseinternalfqdn
to True
value, you have to update the coredns
ConfigMap.
kind: ConfigMap\napiVersion: v1\nmetadata:\n name: coredns\n namespace: kube-system\ndata:\n Corefile: |\n .:53 {\n log\n errors\n health\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n endpoint_pod_names\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n transfer to * \n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf\n cache 30\n loop\n reload\n loadbalance\n }\n
"},{"location":"2.0/config/editconfig/","title":"How to edit pyos
core service configuration file","text":"The pyos
core service configuration file name is od.config
If the od.config
file does not exist, download the default od.config file and save it as od.config
to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
"},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"Change the defaultbackgroundcolors
option in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local file od.config
.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"To check that the new colours are presents in front, open the url http://localhost:30443
, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colour and you should have it as background colour :
Great, you can easily update your configuration file od.config
.
The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"The abcdesktop release 3.0 has started in May 2022
containerd
is recommended by defaultIn release 3.0, the abcdesktop control plane uses only Kubernetes
API. It doesn't depend to dockerd
.
Auth service supports LDAP Posix Account
"},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"Application can run as :
kubernetes pod
kubernetes ephemeral container
Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath
on each worker node or as persistentVolumeClaim
. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.
Ephemeral container
and Pod
","text":"An abcdesktop application can run as a kubernetes ephemeral container
or as a pod
.
An ephemeral container
can access to share memory shm
with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container
does not prevent cpu and memory resource limits.
A pod
can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod
, you can specify resource limits.
To describe the difference between ephemeral-container
and pod-application
, we use the game 2048, one instance come from alpine based on gtk
, the second one come from ubuntu based on qt
2048-alpine
is a GTK application, and is defined to run as ephemeral-container
2048-ubuntu
is a QT application, and is defined to run as a kubernetes podjq
command preinstalled.Get a shell to your abcdestkop server.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download2048-alpine
and 2048-ubuntu
json files","text":"Open a shell to your abcdesktop server
curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n
Check that the json files are downloaded
$ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n
Look at the label oc.containerengine for each json file
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n
The response is ephemeral_container
ephemeral_container\n
This application 2048-alpine will start as an ephemeral_container
cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n
The response is pod_application
pod_application\n
This application 2048-ubuntu will start as a pod_application
, it's a pod.
2048-alpine
and 2048-ubuntu
applications to your abcdesktop service","text":"curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n
Each curl command returns a complete json document.
Wait for the pull pod are Ready
kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n
Wait for condition met
pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :
http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"Login in as the user Hermes Conrad
Hermes Conrad
hermes
Your desktop is created. By default your dock is empty.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"In the search text area, write the keyword 2048
The two applications appear in the search result applications area.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"Start 2048-ubuntu
and 2048-alpine
application
2048-ubuntu
and 2048-alpine
applications start. The application 2048-alpine
can start quickly than the application 2048-ubuntu
.
2048-alpine
is an ephemeral container attached to the graphical container.2048-ubuntu
is a complete kubernetes pod.Get the running pod using kubectl get pods -n abcdesktop
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nhermes-app-2048-ubuntu-4dd6f 1/1 Running 0 8s\nhermes-db906 4/4 Running 0 100s\nmemcached-od-57c57c4f9d-92fs2 1/1 Running 0 38m\nmongodb-od-f69ff6b5b-v6ztc 1/1 Running 0 38m\nnginx-od-58f86c4dc8-8n9lf 1/1 Running 0 25m\nopenldap-od-d66d66bf4-84lg8 1/1 Running 0 38m\npyos-od-5586b88767-gsdl8 1/1 Running 0 14m\nspeedtest-od-6c59bdff75-n6s66 1/1 Running 0 38m\n
The application 2048-ubuntu
is listed as a pod. The application 2048-ubuntu
is a pod. The prefix is the $userid-app
for example hermes-app-2048-ubuntu-4dd6f
, followed by the application name 2048-ubuntu
and a uuid.
The application 2048-alpine
is not a pod.
The application 2048-alpine
is listed as an ephemeral container, inside the user pod hermes-db906
kubectl get pods hermes-db906 -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n
The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses
[\n {\n \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n \"lastState\": {},\n \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n \"ready\": false,\n \"restartCount\": 0,\n \"state\": {\n \"terminated\": {\n \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n \"exitCode\": 0,\n \"finishedAt\": \"2023-05-17T14:38:13Z\",\n \"reason\": \"Completed\",\n \"startedAt\": \"2023-05-17T14:37:00Z\"\n }\n }\n }\n]\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"An ephemeral container
can access to share memory shm
with the X11 server. An ephemeral container run always on the same node as the X11 server.
A pod
can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.
If your application need to share memory with X11 server, when you have to set the oc.containerengine
label to ephemeral_container
.
Use an ephemeral container to start an application have some advantages and some disadvantages.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":"shareProcessNamespace: true
limits
and requests
(cpu, memory)nodeSelector
not supportedUse a kubernetes pod to start an application have some advantages and some disadvantages.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":"limits
and requests
are supportednodeSelector
support an application can run on a dedicated node (for example with GPU)'X11LISTEN': 'tcp'
BadShmSeg
error","text":"If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error
applications to your abcdesktop service","text":"curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n
Wait for the pulled pod are Ready
kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n
Wait for condition met
pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n
Login to your abcdesktop service
Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :
http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"Login in as the user Hermes Conrad
Hermes Conrad
hermes
Your desktop is created. By default your dock is empty.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"In the search text area, write the keyword 2048
The three applications appear in the search result applications area.
Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.
In the abcdesktop menu, choose Settings
|\u00a0Tasks
.
Then select the Logs
button. The error was 'BadShmSeg (invalid shared segment parameter)'.
(org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n
If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM
value to 1
.
QT_X11_NO_MITSHM=1 \n
Note your can also use QT_XCB_NO_MITSHM
value to 1
chromium
application","text":"For chromium
application disabled shm-usage
with the parameters --disable-dev-shm-usage
disable-dev-shm-usage
get more informations about the dev shm usage and all chromium parameters
no-sandbox
: get more informations about the no-sandbox parameters.
cannot open display
or could not connect to display
error","text":"When you start an application the log file write cannot open display
error
kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba -n abcdesktop \n
qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n
Using the web shell inside an abcdesktop session, start netstat -a
command line
The result should show that the process Xvnc
is listening on tcp port number 6000
hermes:~$ netstat -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 82/Xvnc \n
If Xvnc
is not listening on tcp port number 6000
Update od.config to make Xvnc
listen on tcp port number 6000
Open your od.config file, and look at the desktop.envlocal
option.
Add 'X11LISTEN': 'tcp'
to the dictionary :
desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n 'X11LISTEN' : 'tcp' }\n
Save your local od.config
file.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Then restart pyos pod
kubectl delete pod -l run=pyos-od -n abcdesktop\n
You should read on stdout
pod \"pyos-od-5586b88767-mrf28\" deleted\n
"},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":"ctr
command preinstalled .nodejs
and npm command preinstalled.docker
command preinstalled.xterm
. xterm program is a terminal emulator for the X Window System. The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps
git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n
And install nodejs
packages for oc.apps
npm install\n
"},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"abcdesktop uses a json file description to build an application.
Create a sample.json
file
{\n \"tag\": \"3.0\",\n \"acl\": { \"permit\": [ \"all\" ] },\n \"cat\": \"development\",\n \"icon\": \"small.svg\",\n \"apkpackage\": \"xterm\",\n \"keyword\": \"xterm,shell,cmd\",\n \"launch\": \"xterm.XTerm\",\n \"name\": \"Xterm\",\n \"path\": \"/usr/bin/xterm\",\n \"rules\": { \"homedir\": { \"default\": true } },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
"},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile
from the sample.json
file","text":"make.js
is a command line for abcdesktop. make.js
read a json file and create a Dockerfile
The make.js
options are :
-r 3.0
: to build image in abcdesktop 3.0 format-d True
: to create a Dockerfile
as output-f sample.json
: file to read as inputnpm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities
node make.js -r 3.0 -d True -f sample.json\n
Your read on stdout.
Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n acl: { permit: [ 'all' ] },\n cat: 'development',\n icon: 'small.svg',\n apkpackage: 'xterm',\n keyword: 'xterm,shell,cmd',\n launch: 'xterm.XTerm',\n name: 'Xterm',\n path: '/usr/bin/xterm',\n rules: { homedir: { default: true } },\n template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n
Read the Dockerfile
cat Dockerfile\n
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
"},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0
from Dockerfile","text":"docker build -t abcsample:3.0 .\n
Sending build context to Docker daemon 44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
"},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0
","text":"abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.
In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.
Export the image to OCI image format
docker save abcsample:3.0 -o abcsample.tar\n
Import abcsample into the namespace k8s.io
using ctr
ctr -n k8s.io images import abcsample.tar\n
unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
"},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0
in to abcdesktop","text":"Export the abcsample:3.0 image to OCI format
docker image inspect abcsample:3.0 > abcsample.json\n
Import the abcsample.json
into abcdesktop endpoint /API/manager/image
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n
Return a json document
[\n {\n \"home\": null,\n \"cmd\": [\n \"/composer/appli-docker-entrypoint.sh\"\n ],\n \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n \"id\": \"abcsample:3.0\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"launch\": \"xterm.XTerm\",\n \"name\": \"Xterm\",\n \"icon\": \"small.svg\",\n \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n \"keyword\": \"xterm,xterm,shell,cmd\",\n \"uniquerunkey\": null,\n \"cat\": \"development\",\n \"args\": null,\n \"execmode\": null,\n \"security_opt\": null,\n \"showinview\": null,\n \"displayname\": \"Xterm\",\n \"mimetype\": [],\n \"path\": \"/usr/bin/xterm\",\n \"desktopfile\": null,\n \"executablefilename\": \"xterm\",\n \"usedefaultapplication\": null,\n \"fileextensions\": [],\n \"legacyfileextensions\": [],\n \"host_config\": {},\n \"secrets_requirement\": null,\n \"run_inside_pod\": false,\n \"image_pull_policy\": \"IfNotPresent\",\n \"image_pull_secrets\": null\n }\n]\n
"},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"Open a web browser and go to abcdesktop service url.
Open a new abcdesktop session.
Look for your new application xterm
Start your new application xterm
The icon of then new application xterm is a green rect. It appears in the dock.
Logoff to free ressources.
You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json
it describe all json applications for abcdesktop.
To rebuild all application in applist.json
, run node make.js -r 3.0
node make.js -r 3.0\n
This command has create new '.d' files.
$ ls *.d\nls *.d\nalpine-2048.d calculator.d drawio.d flare.d hyper.d kturtle.d octave.d remotedesktopmanager.d terminal.d winefile-wine.d youtube.d\napachedirectorystudio.d chess.d edge.d frozen-bubble.d impress.d leocad.d onlyoffice.d rhythmbox.d terminalpod.d winemine-wine.d\nastromenace.d chrome.d elementary.terminal.d gcompris.d inkscape.d librecad.d openshift.d robots.d tetravex.d winhelp-wine.d\natom.d chromium.d eog.d gedit.d kalzium.d mahjongg.d pinta.d shotcut.d thunderbird.d winscp-wine.d\nbase.d citrix.d evince.d gelemental.d kdiamond.d math.d planner.d stellarium.d ubuntu-2048.d wireshark.d\nbeekeeperstudio.d cloudfoundry.d evolution.d geogebra.d kgeography.d mathwar.d postman.d step.d vice.d writer.d\nblender.d cntlm.d file-roller.d gimagereader.d kigo.d minecraft.d putty-unix.d stress.d vlc.d xedit.d\nbless.d corsix-th.d filelight.d gimp.d klickety.d mines.d putty-wine.d sublime-text.d vmmacos.d xeyes.d\nblobby.d dia.d filezilla.d gnumeric.d klotski.d nautilus.d qelectrotech.d supertux2.d vmrc.d xman.d\nbrackets.d doom.d firefox-esr.d golly.d konsole.d notepad-wine.d remarkable.d swell-foop.d vmubuntu.d xpad.d\ncalc.d draw.d firefox.d gretl.d ksquares.d notepadqq.d remmina.d teams.d vscode.d xterm.d\n
Each .d
file is a Dockerfile
Run make
to build all applications (it can take more than 2 hours)
make\n
"},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"The authentification configuration is set in the od.config
file. In this chapter you will need to update the od.config
configuration file. This update differs depending on the configuration docker mode or kubernetes mode.
Read the Update your configuration file and apply the new configuration file section to make change in od.config
file for kubernetes cluster.
The authmanagers is defined as a dictionary object :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
The od.config
defines four kinds of entries in the authmanagers
object :
external
: use for OAuth 2.0 Authentificationexplicit
: use for LDAP, LDAPS and ActiveDirectory Authentificationmetaexplicit
: use Microsoft Active Directory Trusted relationship, with support of FSP (Foreign Security Principals)implicit
: use for Anonymous Authentification and SSL-client certificat external
For OAuth 2.0 authentification metaexplicit
For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit
For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit
For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"You should have read the hands-on :
od.config
file for kubernetes cluster.Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit
, explicit
, and external
, as describe :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
Save your new od.config
file, and restart the pyos pod
Start your web browser and open the URL http://localhost:30443
The Web home page should only show the title abcdesktop.io. There is no authmanagers
available.
Great you can now add some value to authenticate your users.
"},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagersimplicit
:","text":"implicit
is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.
explicit
:","text":"explicit
is defined to use a directory service like LDAP. Read the authmanagers explicit Section.
metaexplicit
:","text":"metaexplicit
offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.
external
:","text":"external
use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.
In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.
You can set a complete authmanagers
dictionary as described with external
, explicit
and implicit
authmanagers: {\n 'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n },\n 'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx', \n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n },\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n },\n 'github': {\n 'displayname': 'Github',\n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'read:user' ], \n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=github',\n 'authorization_base_url': 'https://github.com/login/oauth/authorize',\n 'token_url': 'https://github.com/login/oauth/access_token',\n 'userinfo_url': 'https://api.github.com/user',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n }\n },\n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n }}\n\n\nadconfig : { \n 'AD': { \n 'default' : True, \n 'ldap_timeout': 15,\n 'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n 'domain': 'AD',\n 'auth_type': 'KERBEROS',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'krb5_conf': '/etc/krb5.conf',\n 'servers' : [ 'ldap://192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n 'auth_protocol' : { \n 'ntlm': True, \n 'cntlm': False, \n 'kerberos': True, \n 'citrix': False, \n 'localaccount': True },\n 'query_dcs' : False } } }\n
"},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"3.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string not used by ldap, only used by Active Directory providers
dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref
.
Providers :
The provider is formated as a dictionnary
{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The ldapconfig is a dictionnary.
For example :
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://192.168.8.195' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n\n}\n
"},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this domain as default domain True tls_require_cert
boolean The default value is False. tls_require_cert
apply only if ldap server URI starts with ldaps
. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True
This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
False basedn
string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ]
IP Address or FQDN values scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"3.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
The explicit
authentification support the directory services ldap
, ldaps
, and Microsoft Active Directory
.
Configuration sample for Microsoft Active Directory
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
"},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers
"},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"3.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n } \n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local
is referred to your public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"Facebook's OAuth is supported for authentication.
"},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n },\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.
"},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API
'github': {\n 'displayname': 'Github',\n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'read:user' ], \n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=github',\n 'authorization_base_url': 'https://github.com/login/oauth/authorize',\n 'token_url': 'https://github.com/login/oauth/access_token',\n 'userinfo_url': 'https://api.github.com/user',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"3.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionnary object and contains an anononymous
provider.
anononymous
provider always permit authentification, and create a uuid as userid. anononymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anononymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers dictionnary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Press the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command docker ps -a
docker ps -a\n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When the anonymous container is removed, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"3.0/config/authmetaexplicit/","title":"Authentificationmetaexplicit
for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit
object","text":"The metaexplicit
authentification manager contains only one provider. The provider must be defined as metadirectory
.
'metaexplicit': {\n 'providers': {\n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description providers
dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}
"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory
provider configuration","text":"The metadirectory
provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref
.
A metadirectory
provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut
.
coporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } } \n
Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description
value to get the user's trusted domain.
For example :
description: AD\\john\n
Then pyos look for provider AD
configuration and process authentification on domain AD
The metadirectory
accounts can be disabled. The ldap attribut userAccountControl
is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE
set or not.
A service account must defined for a metadirectory
provider. The service account is used to bind the metadirectory.
metadirectory
provider and active directory user domain","text":"The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut
authmanagers: {\n #\n # define the meta explicit manager\n # This is the trusted external forest for the followed domain\n #\n 'metaexplicit': {\n 'providers': {\n # define the metadirectory provider\n # only one metadirectory provider is supported \n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True } \n }\n },\n\n # \n # define the Active Directory provider for each DOMAIN\n # define two domains in two disctinct forest with a trust relationship \n # \n 'explicit': { \n # define an Active Directory provider AD \n 'AD': { 'config_ref': 'adconfig', 'enabled': True },\n # define an Active Directory provider ANOTHER\n 'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True } \n }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': { 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'NTLM',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n 'ldap_basedn' : 'DC=another,DC=super,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.another.super.local',\n 'domain' : 'ANOTHER',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn' : 'ANOTHER.SUPER.LOCAL',\n 'servers' : [ 'ldap://192.168.10.12' ],\n 'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectory
support","text":"metadirectory
support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory
support isMemberOf
on foreign security principal.
The user's SID
of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.
The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )
To get more information about foreign security principal (FSP), read :
Foreign Security Principals Container
Active Directory: Foreign Security Principals and Special Identities
balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":"Replace type: NodePort
by type: LoadBalancer
into the nginx service
Save this yaml as nginx.service.http.loadbalancer.yaml
file name
kind: Service\napiVersion: v1\nmetadata:\n name: nginx\n namespace: abcdesktop\nspec:\n type: LoadBalancer\n selector:\n run: nginx-od \n ports:\n - protocol: TCP\n port: 80\n targetPort: 80\n name: http\n
# delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n
Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service
kubectl get services -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 57m\nmemcached ClusterIP 10.245.247.50 <none> 11211/TCP 57m\nmongodb ClusterIP 10.245.198.243 <none> 27017/TCP 57m\nnginx LoadBalancer 10.245.172.53 <pending> 80:30443/TCP 57m\nopenldap ClusterIP 10.245.109.131 <none> 389/TCP,636/TCP 57m\npyos ClusterIP 10.245.94.15 <none> 8000/TCP 57m\nspeedtest ClusterIP 10.245.67.168 <none> 80/TCP 57m\n
You get the EXTERNAL-IP
for your LoadBalancer
service
kubectl get services -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 61m\nmemcached ClusterIP 10.245.247.50 <none> 11211/TCP 61m\nmongodb ClusterIP 10.245.198.243 <none> 27017/TCP 61m\nnginx LoadBalancer 10.245.172.53 161.35.246.4 80:30443/TCP 61m\nopenldap ClusterIP 10.245.109.131 <none> 389/TCP,636/TCP 61m\npyos ClusterIP 10.245.94.15 <none> 8000/TCP 61m\nspeedtest ClusterIP 10.245.67.168 <none> 80/TCP 61m\n
Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4
Login using Philip J. Fry
And you should get the fry
desktop
port-forward
","text":"Use the kubectl port-forward
command and a forwarded local port to help troubleshooting issues.
Get the pod name for nginx
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-69fb8fd8bb-qg4z2 1/1 Running 0 11h\n
Choose the nginx's pod, to forward local port 80 to nginx 80
kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n
Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80
Then open your web browser http://localhost
, you should get the home page, login using LDAP auth
or Anonymous auth
should work.
Then login, and you get a pod user.
For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.
kubectl get pods -n abcdesktop \nNAME READY STATUS RESTARTS AGE\nmemcached-od-bdcbbcb74-nhd68 1/1 Running 0 11h\nmongodb-od-d46d79476-fmbj5 1/1 Running 0 11h\nnginx-od-69fb8fd8bb-qg4z2 1/1 Running 0 11h\nopenldap-od-795c55f6db-wz7l4 1/1 Running 0 11h\npyos-od-988887859-8kwdx 1/1 Running 0 11h\nspeedtest-od-6b5f8584f5-cs69t 1/1 Running 0 11h\nfry-2cf3a 4/4 Running 0 4m15s\n
The user fry
gets the abcdesktop pod fry-2cf3a
This example works on digitalocean cloud provider.
First of all, you need to get your loadbalancer-certificate-id
To list available certificates and their IDs, install doctl and run the command
doctl compute certificate list\n
Then define annotations
on the abcdesktop nginx service like
service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n
Create a loadbalancing.yaml
file, to update the default abcdestkop service/nginx
You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id
with your own certificate value.
--- \nkind: Service \napiVersion: v1\nmetadata: \n name: nginx \n namespace: abcdesktop\n annotations:\n service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n labels:\n abcdesktop/role: nginx\nspec: \n type: LoadBalancer\n selector:\n run: nginx-od\n ports:\n - protocol: TCP\n port: 443\n targetPort: 80\n name: https\n---\n
Apply the new loadbalancing.yaml
file
kubectl apply -f loadbalancing.yaml\n
You can read
service/nginx configured\n
Check the nginx/services
kubectl get service/nginx -n abcdesktop\n
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.188.146 161.35.246.4 443:32086/TCP 28m\n
Now you can replace http
by the secure protocol https
abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
List of all abcdesktop's controllers and the description :
Controller DescriptionAccountingController
accounting data json format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, createApplication) CoreController
get configuration and user message info ManagerController
manage service (like add an application) UserController
retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"The controllers
configuration is a dictionary, and is defined in the pyos's od.config
file.
controllers : { \n 'AccountingController': { \n 'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'ManagerController': { \n 'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n} \n
By default, AccountingController
and ManagerController
access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.
By default, others controllers access is enabled, without any restriction.
"},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller
name and with entries permitip
and/or apikey
.
permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or if the controller
is not defined, filtering features is disabled.apikey
is a list of string, for example [ 'fPCdPSSj8gZri1Ncmg', 'Z9pXCa2y6ccDeBBeeUc4' ]
. If apikey
is not set or the controller
not defined, filtering features is disabled. The http header value is X-API-Key
If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key
","text":"Add the http header X-API-Key: fQDbvjCafec4l
to the curl command to list images
curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n
The command returns
{}\n
Add the http header X-API-Key: fQDbvjCafec4l
to the curl command to add new application
curl -X POST -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n
The command returns
[\n { \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n \"path\": \"/usr/bin/xeyes\", \n \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n \"id\": \"abcdesktopio/xeyes.d:3.0\", \n \"rules\": {}, \n \"acl\": {\"permit\": [\"all\"]}, \n \"launch\": \"xeyes.XEyes\", \n \"name\": \"xeyes\", \n \"icon\": \"circle_xfce4-eyes.svg\", \n \"keyword\": \"xeyes,eyes\", \n \"uniquerunkey\": null, \n \"cat\": \"utilities\", \n \"args\": null, \n \"execmode\": null, \n \"showinview\": null, \n \"displayname\": \"xeyes\", \n \"home\": null, \n \"desktopfile\": null, \n \"executeclassname\": null, \n \"executablefilename\": \"xeyes\", \n \"usedefaultapplication\": false, \n \"mimetype\": [], \n \"fileextensions\": [], \n \"legacyfileextensions\": [], \n \"secrets_requirement\": null, \n \"image_pull_policy\": \"IfNotPresent\", \n \"image_pull_secrets\": null, \n \"containerengine\": \"ephemeral_container\", \n \"securitycontext\": {}\n }\n]\n
"},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n
The command returns
{\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
"},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"The od.config contains options to describe how the oc.user and applications containers have to be created.
"},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"All desktop options are defined in od.config file. Desktop options start with the prefix desktop.
, then add the name of the option.
desktop.defaultbackgroundcolors
list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype
string 'hostPath' desktop.remotehomedirectorytype
list [] desktop.persistentvolumespec
string None desktop.persistentvolumeclaimspec
string None desktop.homedirectorytype
string 'hostPath' desktop.envlocal
dictionary { 'X11LISTEN':'tcp'}
desktop.nodeselector
dictionary {}
desktop.username
string 'balloon' desktop.userid
integer 4096 desktop.groupid
integer 4096 desktop.userhomedirectory
string '/home/balloon'
desktop.useinternalfqdn
boolean False desktop.uselocaltime
boolean False desktop.policies
dictionary { 'rules':{}, 'max_app_counter':5 }
desktop.webhookdict
dictionary {}
"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"This option describes how to create the home directory for the user. The value can be defined as :
'None'
: no dedicated volume is created, the oc.user container use an emptyDir': { 'medium': 'Memory'}
. All user data will be removed at logout.'hostPath'
: set a dedicated 'hostPath' volume, the user's container and applications share this volume. User home data are persistent.'persistentVolumeClaim'
: set a dedicated 'persistentVolumeClaim' volume, the user's container and applications share this volume. User home data are persistent.To get more information about user's home directory volume, read the volumes chapter
"},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]
For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.
If desktop.remotehomedirectorytype
contains 'cifs' and if the authentification provider get homeDrive
and homeDirectory
attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive
value, and mounted to homeDirectory
.
The desktop.defaultbackgroundcolors
allow you to change the default background color.
The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]
The desktop.defaultbackgroundcolors
length can contain up to 8 entries. To see the color
Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
You should see the default background colors, for example :
"},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"desktop.envlocal
is a dictionary. desktop.envlocal
contains a (key,value) added as environment variables to oc.user.
The default value is :
{ \n 'X11LISTEN': 'tcp'\n}\n
"},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTEN
tcp
permit X11 to listen on tcp port, default is udp
ABCDESKTOP_RUN_DIR
/var/run/desktop
directory to write pid services ABCDESKTOP_LOG_DIR
/var/log/desktop
directory to write log files services DISABLE_REMOTEIP_FILTERING
disabled
disabled remote ip filtering inside pod user, default is disabled
, change to enabled
to remove core ip filtering SET_DEFAULT_WALLPAPER
myfile.jpeg
name of file to set the user wallpaper, this file must exist in ~/.wallpapers
SET_DEFAULT_COLOR
#6EC6F0
Value of default colour saved in file ~/.store/currentColor
SENDCUTTEXT
enabled
\u00a0Send clipboard changes to user. Set value to disabled
to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext
if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}
. The default value is enabled
ACCEPTCUTTEXT
enabled
\u00a0Accept clipboard updates from user. Set value to disabled
to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext
if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}
. The default value is enabled
"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"desktop.nodeselector
is a dictionary. This option permits to assign user pods to nodes.
It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.
The value must be a string, by example 'true', and matches the labels node value.
desktop.nodeselector: { 'abcdesktopworker': 'true' }\n
To set a label abcdesktopworker=true
to a node
kubectl label node $YOUR_NODE abcdesktopworker=true\n
The commands returns
node/nodesample01 labeled\n
To list all labels on all nodes
kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n
The commands returns
map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n
desktop.nodeselector
is used as selector by pyos to create user's pods and to pull container's images.
desktop.username
is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.
desktop.userid
describes the uid Number
of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.
desktop.groupid
describes the gid Number
of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.
desktop.userhomedirectory
describes the homedirectory
of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory
is string. The default value is /home/balloon
.
The desktop.uselocaltime
is boolean, to use host value of /etc/localtime
. The default value is False
. If desktop.uselocaltime
is True, this add a volume mapping from host file /etc/localtime
to container file /etc/localtime
.
desktop.policies
has a dictionary format.
max_app_counter
limit applications counter, without checking the docker container status rules
rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }
acl
allow or denied desktop creation Example
desktop.policies: { \n 'rules': { \n 'volumes': { \n 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n 'Mygroupteam': { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n } \n },\n 'acls' : {},\n 'max_app_counter' : 4 \n}\n
"},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"desktop.webhookdict is a dictionary to add key/value to the command create
and destroy
in rules objects.
WARNING desktop.desktopuseinternalfqdn
is an experimental feature, keep this value to False in production
desktop.desktopuseinternalfqdn
describes the content of the payload data in the JWT Desktop Token. The default value is False
.
Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False
the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True
the payload data in the JWT Desktop Token contains the FQDN of the user Pod.
If you CAN NOT add endpoint_pod_names
in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn
to False
. This choice is less secure.
To set desktop.desktopuseinternalfqdn
to True
value, you have to update the coredns
ConfigMap.
kind: ConfigMap\napiVersion: v1\nmetadata:\n name: coredns\n namespace: kube-system\ndata:\n Corefile: |\n .:53 {\n log\n errors\n health\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n endpoint_pod_names\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n transfer to * \n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf\n cache 30\n loop\n reload\n loadbalance\n }\n
"},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.
For example
printer
is a service. printer
service runs inside the user pod. graphical
is a service. graphical
service runs inside the user pod and is the default service.init
contains init command for user podgraphical
is the user graphical service (X11 and VNC)spawner
is the command service for graphical servicebroadcast
is the broadcast service for graphical servicewebshell
is the web socket bash shell service for graphical serviceprinter
is the printer service (cupsd)printerfile
is the file service to download generated PDF file (this file transfert service is dedicated for printer service)sound
is the sound service (pulseaudio) to send rtp stream from a container to the web browser via janus webrtc gatewayfiler
is the filer service to upload and download file into the user home directorystorage
contains abcdesktop user secrets, like Kerberos, NTLM hashes, VNC password.Each service :
'enable': True
'resources'
limits resources for a container'acl'
to start or not using rules 'securityContext'
or use the spec securityContext
'secrets_requirement
, a list of secrets to run example ['abcdesktop/vnc', 'abcdesktop/kerberos']
desktop.pod : { \n 'spec' : {\n 'shareProcessNamespace': True,\n 'shareProcessMemory': True,\n 'shareProcessMemorySize': '256Mi',\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ],\n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True\n }\n }, \n 'graphical' : { \n 'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'acl': { 'permit': [ 'all' ] },\n 'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n 'resources': { \n 'requests': { 'memory': \"320Mi\", 'cpu': \"250m\" }, \n 'limits': { 'memory': \"1Gi\", 'cpu': \"1000m\" } \n },\n 'shareProcessNamespace': True,\n 'tcpport': 6081,\n 'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n },\n 'spawner' : { \n 'enable': True,\n 'tcpport': 29786,\n 'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n 'acl': { 'permit': [ 'all' ] } \n },\n 'broadcast' : { \n 'enable': True,\n 'tcpport': 29784,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'webshell' : { \n 'enable': True,\n 'tcpport': 29781,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'printer' : { \n 'image': 'abcdesktopio/oc.cupsd:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 681,\n # cupsd need to start as root\n 'securityContext': { 'runAsUser': 0 },\n 'resources': { \n 'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" }, \n 'limits' : { 'memory': \"512Mi\", 'cpu': \"500m\" } \n },\n 'acl': { 'permit': [ 'all' ] } \n },\n 'printerfile' : { \n 'enable': True,\n 'tcpport': 29782,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'filer' : { \n 'image': 'abcdesktopio/oc.filer:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 29783,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'storage' : { \n 'image': 'k8s.gcr.io/pause:3.8',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"32Mi\", 'cpu': \"100m\" }, \n 'limits' : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n }\n },\n 'sound': { \n 'image': 'abcdesktopio/oc.pulseaudio:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': False,\n 'tcpport': 4714,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"8Mi\", 'cpu': \"50m\" }, \n 'limits' : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n } \n },\n 'init': { \n 'image': 'busybox',\n 'enable': True,\n # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n 'imagePullPolicy': 'IfNotPresent',\n 'securityContext': { 'runAsUser': 0 },\n 'acl': { 'permit': [ 'all' ] },\n 'command': [ 'sh', '-c', 'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n },\n 'ephemeral_container': {\n 'enable': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}'\n },\n 'acl': { 'permit': [ 'all' ] }\n },\n 'pod_application' : {\n 'enable': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}'\n },\n # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n 'acl': { 'permit': [ 'all' ] } } }\n\n
"},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"A container is added to the user pod if 'enable': True
The container is added to the user pod if acl
matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.
The image use the kubernetes pull policy values :
IfNotPresent
the image is pulled only if it is not already present locally.Always
kubelet queries the container image registry to resolve the name to an image digest.Never
the kubelet does not try fetching the image. If the image is somehow already present locally, the kubelet attempts to start the container; otherwise, startup fails. Read the pullpolicy kubernetes documentation to get more details.
"},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"waitportbin
is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport
value.
The command is run with parameters :
/composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
"},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"waitportbintimeout
is the timeout in seconds to get waitportbin
command result.
Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0'
)
The imagePullSecret
entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret
is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.
imagePullSecret : [ { 'name': name_of_secret } ]\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
The imagePullSecret
become in this sample
imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
"},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.
"},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"spec
entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.
{{ uidNumber }}
is replaced by the user's uidNumber
on ldap if the objectClass is posixAccount or if not set by the default user id set in option desktop.userid
{{ gidNumber }}
is replaced by the user's gidNumber
on ldap if the objectClass is posixAccount is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
{{ supplementalGroups }}
is replaced by the list of groups gidNumber
is posixGroup
shareProcessNamespace
When process namespace sharing is enabled, processes in a container are visible to all other containers in the same pod. Read the kubernetes shareProcessNamespace details, to get more details.
shareProcessMemory
Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries. POSIX shared memory requires that a tmpfs be mounted at /dev/shm. Containers in a pod do not share their mount namespaces so we use volumes to provide the same /dev/shm into each container in a pod. Read shared_memory to get more details. Shared memory is defined as an emptyDir volume { 'name': 'shm', { 'medium': 'Memory', 'sizeLimit': shareProcessMemorySize } }
minted on /dev/shm
. Only ephemeral container application can share memory with the X11 server. To get more details about POSIX and UNIX System V shared memory objects, read the podshmtest repository.
shareProcessMemorySize
is the size of shareProcessMemory
. The size is set to the shm
volume 'sizeLimit': shareProcessMemorySize
'spec' : {\n 'shareProcessNamespace': True,\n 'shareProcessMemory': True,\n 'shareProcessMemorySize': '256Mi',\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ],\n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True\n }\n
"},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }
.
The command support {{ }}
values. Values can be
'{{ uidNumber }}'
'{{ gidNumber }}'
'{{ uid }}'
Values are read from the previous ldap authentification.
'{{ uidNumber }}'
is replaced by the ldap uidNumber
or if not set by the default user id set in option desktop.userid
'{{ gidNumber }}'
is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
'{{ uid }}'
is replaced by the ldap uid
or if not set by the default user name set in option desktop.username
Example
'command': [ 'sh', '-c', 'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
"},{"location":"3.0/config/editconfig/","title":"How to edit pyos
core service configuration file","text":"The pyos
core service configuration file name is od.config
If the od.config
file does not exist, download the default od.config file and save it as od.config
to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
"},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"Change the defaultbackgroundcolors
option in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local file od.config
.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"To check that the new colours are presents in front, open the url http://localhost:30443
, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colour and you should have it as background colour :
Great, you can easily update your configuration file od.config
.
The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":"jpxavier-oio has designed the network policy for abcdesktop.io
"},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":"There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights
and the NetworkPolicy permits
.
The NetworkPolicy rights
contains egress
and ingress
for pod selected by tag. rights
means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.
The NetworkPolicy permits
contains egress
to a pod selected by tag. The NetworkPolicy permits
means permit access to this pod.
The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicyrights
and permits
for the memcached
.","text":"The memcached
service is listening on TCP port 11211. The NetworkPolicy for memcached service rights
, named memcached-rights
, allows pods with label run: memcached-od
to expose the TCP port 11211.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: memcached-rights\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n run: memcached-od\n policyTypes:\n - Ingress\n ingress:\n - ports:\n - protocol: TCP\n port: 11211\n from:\n - podSelector:\n matchLabels:\n netpol/memcached: 'true'\n - namespaceSelector:\n matchLabels:\n name: kube-monitor\n podSelector:\n matchLabels:\n netpol/metrics: 'true'\n
The NetworkPolicy for memcached service permits
, named memcached-permits
, allows all pods with label netpol/memcached: 'true'
to reach the TCP port 11211 to pods with label run: memcached-od
.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: memcached-permits\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n netpol/memcached: 'true'\n policyTypes:\n - Egress\n egress:\n - ports:\n - protocol: TCP\n port: 11211\n to:\n - podSelector:\n matchLabels:\n run: memcached-od\n---\n
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights
and permits
for the user's pods.","text":"The ocuser
pod is listening on TCP ports :
The network policy for ocuser's pods rights
is named ocuser-rights
. It allows pods with label type: 'x11server'
to expose the previous TCP ports.
The egress
network policy allows :
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: ocuser-rights\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n type: 'x11server'\n policyTypes:\n - Ingress\n - Egress\n ingress:\n - from:\n - podSelector:\n matchLabels:\n netpol/ocuser: 'true'\n ports:\n - protocol: TCP\n port: 4714\n - protocol: TCP\n port: 6081\n - protocol: TCP\n port: 8000\n - protocol: TCP\n port: 29780\n - protocol: TCP\n port: 29781\n - protocol: TCP\n port: 29782\n - protocol: TCP\n port: 29783\n - protocol: TCP\n port: 29784\n - protocol: TCP\n port: 29785\n # spawner_service_tcp_port\n - protocol: TCP\n port: 29786\n egress:\n # pod user can run dns query to all kube-system\n - ports:\n - protocol: TCP\n port: 53\n - protocol: UDP\n port: 53\n to:\n - namespaceSelector:\n matchLabels:\n name: kube-system\n podSelector:\n matchLabels:\n k8s-app: kube-dns\n# permit www website from pod user \n - ports:\n - protocol: TCP\n port: 443\n - protocol: TCP\n port: 80\n# permit kerberos auth kinit\n - ports:\n - protocol: UDP\n port: 88\n - protocol: TCP\n port: 88\n
The network policy for ocuser's pods permits
is named ocuser-permits
. It allows pods with label netpol/ocuser: 'true'
to reach the user's pods services.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: ocuser-permits\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n netpol/ocuser: 'true'\n policyTypes:\n - Egress\n egress:\n - to:\n - podSelector:\n matchLabels:\n type: 'x11server'\n ports:\n # default pulseaudio websocket audio without webrtc gateway\n - protocol: TCP\n port: 4714\n # vnc websockify\n - protocol: TCP\n port: 6081\n # reserved\n - protocol: TCP\n port: 29780\n # xterm_tcp_port\n - protocol: TCP\n port: 29781\n # printerfile_service_tcp_port\n - protocol: TCP\n port: 29782\n # file_service_tcp_port\n - protocol: TCP\n port: 29783\n # broadcast_tcp_port \n - protocol: TCP\n port: 29784\n # reserved\n - protocol: TCP\n port: 29785\n # spawner_service_tcp_port\n - protocol: TCP\n port: 29786\n
"},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml
file","text":"To apply the network policies run the command :
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
The command returns
networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
"},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n
This http request is denied by the network policy and you should get an error message
You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API
.
To disable the network policies, run the kubectl delete command :
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n
You should get a json document as http response
{}\n
You may need to update the netpol-default.yaml file with your own values.
"},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
run the sudo command inside the user kubernetes pods
balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
"},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"In the securityContext
add the entry 'allowPrivilegeEscalation': True
desktop.pod : {\n 'spec' : {\n 'shareProcessMemorySize': '512Mi',\n 'shareProcessMemory': True,\n 'shareProcessNamespace': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'capabilities': { \n 'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n }\n }\n }\n...\n
"},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"Delete the pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
The default balloon password is lmdpocpetit
balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# \n
After the sudo command, you get a root level inside the shell of the users's pod
In production this value should be set to False
"},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":" 'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"To retain user's home directory files, you can define
hostPath
. The hostPath
can also be a mount point.storageClassName
parameter. Two examples are described one using nfs
, the second one using s3
.hostPath
","text":"In your od.config file, define the new entries desktop.homedirectorytype
desktop.persistentvolumespec
desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim'desktop.persistentvolumespec
: create a new volume for the user's homeDir, for persistentVolume hostPath.desktop.persistentvolumeclaimspec
: create a new volume claim for the user's homeDir# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n 'storageClassName': '',\n 'capacity': { 'storage': '1Gi' },\n 'accessModes': [ 'ReadWriteOnce' ], \n 'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': '',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'
.
{{ provider }}
is the provider's name templated value. {{ userid }}
is the user's id templated value.The list of all template values can be read at the end of this chapter
The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}
. The directory is created automatically by kubernetes.
The /mnt/abcdesktop_volumes/
content lists the provider name.
On the host, the new directory is created, where each home directory is located.
Read the new path for 'hostPath' persistent volumes
ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai 11 11:34 ..\ndrwxr-xr-x 3 root root 4096 mai 12 12:40 anonymous\ndrwxr-xr-x 3 root root 4096 mai 12 12:39 github\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 google\n
For provider google
, all users are listed.
ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 .\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 114102844260599245242\n
For provider google
, list the user home directory for the user 103464335761332102620
ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 .\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 ..\n-rw------- 1 2048 2048 71 mai 12 12:39 .Xauthority\n-rw-rw-r-- 1 2048 2048 12 janv. 27 18:36 .Xresources\ndrwxr-x--- 3 2048 2048 4096 mai 12 12:39 .cache\ndrwxr-x--- 6 2048 2048 4096 mai 12 12:39 .config\ndrwxrwxr-x 3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r----- 1 2048 2048 0 mai 12 12:39 .gtk-bookmarks\n-rw-rw-r-- 1 2048 2048 564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x--- 3 2048 2048 4096 mai 12 12:39 .local\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 .store\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 .wallpapers\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Desktop\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Documents\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Downloads\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Music\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Pictures\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Public\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Templates\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Videos\n
"},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rulesNote: hostPath
supports file permissions and the pod's init commands chown
or chmod
can be used. The hostPath
can also be a mount point, using nfs.
storageClassName
","text":"To define a persistentVolumeClaim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n
desktop.persistentvolumeclaimspec
is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.
For example
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
Replace mystorageclass
by storageclass of your cloud provider
kubectl get storageclass\n
The example output is as follows on the cloud provider aws.
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
The example output is as follows on the cloud provider digitalocean.
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs
","text":"In this example, we use nfs to share user home directory with each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistentVolumeClaim features.desktop.persistentvolumespec
: None to skip the persistent volume provisioning.desktop.persistentvolumeclaimspec
create a new volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'nfs-csi-sc-ds01',\n 'resources': { \n 'requests': { \n 'storage': '500Mi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
Update the new config file and restart pyos
pod
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32 25Mi RWO Delete Bound abcdesktop/planet-fry-9372f nfs-csi-sc-ds01 3m\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry-9372f Bound pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32 25Mi RWO nfs-csi-sc-ds01 5m7s\n
Get the PersistentVolumeClaim's description
kubectl describe pvc planet-fry-9372f -n abcdesktop \nName: planet-fry-9372f\nNamespace: abcdesktop\nStorageClass: nfs-csi-sc-ds01\nStatus: Bound\nVolume: pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\n pv.kubernetes.io/bound-by-controller: yes\n volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 25Mi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-87066\nEvents:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal ExternalProvisioning 7m (x2 over 7m) persistentvolume-controller Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n Normal Provisioning 7m nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3 External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n Normal ProvisioningSucceeded 7m nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3 Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
"},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server
The user fry
has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com
On the nfs server, define a quota for uid fry
. In this case, I use truenas as nfs server.
Create the fry
user with the same attribute and value.
On the Storage |\u00a0Pools |\u00a0User Quotas
, define a quota for the user fry
Set the quota value for fry
Delete previous pvc
and pv
for the fry
user, if need.
Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the dd commands
Run a dd
command to reach the quota value (50 MiB is this case).
dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n
You should get the error Disk quota exceeded
. The size of quota-test-file is over a the quota limit.
50 MB is 52,428,800 Bytes
ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n
The user should not be able to create new file
dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n
The nfs server has returned an error if the user tries to create more than 50 MiB.
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim usingk8s-csi-s3
","text":"In this example, we use s3 to share user home directory with each worker node
Use the https://github.com/yandex-cloud/k8s-csi-s3
as a CSI for S3
with minio as backend.
Follow https://github.com/yandex-cloud/k8s-csi-s3
setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.
---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n mounter: geesefs \n # you can set mount options here, for example limit memory cache size (recommended)\n options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n # to use an existing bucket, specify it here:\n # bucket: abcdesktop\n csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n
Update the csi-s3
storage class to add --setuid 0
as options
kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
"},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config
","text":"In your od.config file, define the entry desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistentVolumeClaim features.desktop.persistentvolumespec
: None to skip the persistent volume provisioning.desktop.persistentvolumeclaimspec
create a new volume claim for the user's homeDir, the storageClassName csi-s3
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'csi-s3',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
"},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"By default the storageclass use mounter: geesefs
. geesefs
does not store file permissions and the init commands chown
or chmod
exit with no zero value, then the pod does not start. All files belongs to root
, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"
.
Update the 'init' in desktop.pod
dict
'init': { \n 'image': 'busybox',\n 'enable': True,\n 'pullpolicy': 'IfNotPresent',\n 'securityContext': {\n 'runAsUser': 0,\n 'runAsGroup': 0 \n },\n 'acl': { 'permit': [ 'all' ] },\n 'command': [ 'sh', '-c', 'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n }\n
Apply the new configuration file and restart pyos pods
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to abcdestkop service using your web browser.
List the persistent volumes
kubectl get pv\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b 1Gi RWO Delete Bound abcdesktop/github-12896316-96cb5 csi-s3 2m46s\n
List the persistent volume claims
# kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\ngithub-12896316-96cb5 Bound pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b 1Gi RWO csi-s3 2m21s\n
"},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
\n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite
expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"
To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04
"},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"Execute command swapoff to disable swap.
swapoff -a\n
Load the overlay
and br_netfilter
kernel modules
modprobe overlay\nmodprobe br_netfilter\n
Create the containerd.conf
to load modules
cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io
from docker repository","text":"Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :
Install common packages
apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n
Add source
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n
You will be prompted with a Y/n option in order to proceed with the installation.
apt update\napt install -y containerd.io\n
containerd.io
will then be installed on your system.
containerd.io
","text":"Configure containerd
to use systemd
as cgroup
.
containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n
Enable the containerd utility by running the following command :
systemctl restart containerd\nsystemctl enable containerd\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"Run the following command in order to get the Kubernetes signing key:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"Run the following commands in order to add the Xenial Kubernetes repository:
echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"Create kubernetes.conf
for sysctl.d
cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n
Reload your system sysctl
changes
sysctl --system\n
Install the packages kubelet
kubeadm
kubectl
apt install -y kubelet kubeadm kubectl\n
K8s utilities will then be installed on your system.
You can check the version number of kubeadm
and also verify the installation through the following command:
kubeadm version -o yaml\n
clientVersion:\n buildDate: \"2022-10-12T10:55:36Z\"\n compiler: gc\n gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n gitTreeState: clean\n gitVersion: v1.25.3\n goVersion: go1.19.2\n major: \"1\"\n minor: \"25\"\n platform: linux/amd64\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
"},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
Option : To use the namespace abcdestkop
as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop
All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.
change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop
You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\ndefault-token-5zknd kubernetes.io/service-account-token 3 6m6s\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. This container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n
You should read on the standard output
clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-57c57c4f9d-92fs2 1/1 Running 0 59m\nmongodb-od-f69ff6b5b-v6ztc 1/1 Running 0 59m\nnginx-od-58f86c4dc8-8n9lf 1/1 Running 0 59m\nopenldap-od-d66d66bf4-84lg8 1/1 Running 0 59m\npyos-od-5586b88767-6gdtk 1/1 Running 0 59m\nspeedtest-od-6c59bdff75-n6s66 1/1 Running 0 59m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain
"},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"All kubernetes resources can be inspected to get more informations.
First list elements you want to verify, in the following case, we will inspect pods :
kubectl get pods -n abcdesktop\n
NAME READY STATUS RESTARTS AGE\nnginx-od-db69c45fb-qnd4n 1/1 Running 0 92s\npyos-od-5586b88767-6gdtk 1/1 Running 0 92s\nmemcached-od-db69c45fb-mqt4n 1/1 Running 0 92s\nmongodb-od-ff874fcb5-sm6f7 1/1 Running 0 92s\nspeedtest-od-55c58fdd69-5znpr 0/1 ImagePullBackOff 0 92s\n
As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :
kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop
In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :
Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Warning Failed 7m6s (x4837 over 18h) kubelet, cube05 Error: ImagePullBackOff\n Normal BackOff 2m9s (x4860 over 18h) kubelet, cube05 Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n
As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"kubectl get deployment -n abcdesktop\n
You should read on the standard output
NAME READY UP-TO-DATE AVAILABLE AGE\nmemcached-od 1/1 1 1 10m\nmongodb-od 1/1 1 1 10m\nnginx-od 1/1 1 1 4m26s\nopenldap-od 1/1 1 1 10m\npyos-od 1/1 1 1 3m2s\nspeedtest-od 1/1 1 1 10m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"kubectl get services -n abcdesktop\n
You should read on the standard output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 11m\nmemcached ClusterIP 10.107.106.62 <none> 11211/TCP 11m\nmongodb ClusterIP 10.96.113.246 <none> 27017/TCP 11m\nnginx NodePort 10.100.253.228 <none> 80:30443/TCP 11m\nopenldap ClusterIP 10.105.69.239 <none> 389/TCP,636/TCP 11m\npyos ClusterIP 10.98.97.186 <none> 8000/TCP 11m\nspeedtest ClusterIP 10.109.48.166 <none> 80/TCP 11m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"cluster roles are disable by default
kubectl describe ClusterRole pyos-role -n abcdesktop\n
You should read on the standard output
Name: pyos-role\nLabels: <none>\nAnnotations: <none>\nPolicyRule:\n Resources Non-Resource URLs Resource Names Verbs\n --------- ----------------- -------------- -----\n pods/ephemeralcontainers [] [] [create get list watch update patch delete]\n pods/exec [] [] [create get list watch update patch delete]\n persistentvolumes [] [] [get list create delete]\n persistentvolumeclaims [] [] [get list update create delete]\n configmaps [] [] [get list watch create update patch delete]\n pods [] [] [get list watch create update patch delete]\n secrets [] [] [get list watch create update patch delete]\n events [] [] [get list watch]\n pods/log [] [] [get list watch]\n endpoints [] [] [get list]\n nodes [] [] [get watch list]\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"cluster roles Bindind are disable by default
kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n
You should read on the standard output
Name: pyos-rbac\nLabels: <none>\nAnnotations: <none>\nRole:\n Kind: ClusterRole\n Name: pyos-role\nSubjects:\n Kind Name Namespace\n ---- ---- ---------\n ServiceAccount pyos-serviceaccount abcdesktop\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n
You should read on the standard output
2023-05-17 13:29:08 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO ] __main__.trace_request:anonymous /healthz\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"To rollout restart the abcdesktop deployment
kubectl rollout restart deployment -n abcdesktop\n
You should read on the standard output
deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n
Check the pods status
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-64c56f9458-jcf9x 1/1 Running 0 32s\nmongodb-od-5b5cc9946d-q7fph 1/1 Running 0 32s\nnginx-od-58bdf79df4-skjsn 1/1 Running 0 32s\nopenldap-od-6dcc5d7f8b-g8gvj 1/1 Running 0 32s\npyos-od-784bd7b5c5-tdzxx 1/1 Running 0 32s\nspeedtest-od-5ff99b6579-st9jx 1/1 Running 0 32s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.0.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json file to the images REST API
curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"This section apply only to configure kubernetes for GNU/Linux.
abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.
"},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"Linux Requierements
"},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.
"},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.
swapoff -a\n
If you have some swaps in /etc/fstab, just comment them out. swapoff -a
will disable all swaps temporarily.
systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
"},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"Run the following command as sudo on the master node:
kubeadm init --pod-network-cidr=10.244.0.0/16\n
The process might take a minute or more depending on your internet connection.
To be able to manage your kubernetes server, you need to run the following commands as a regular user:
mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
"},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.
kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n
It should return the following string.
node/<your-hostname> untainted\n
Taints are Kubernetes flags to prevent Pod Scheduling.
Confirm that you now have a node in your cluster with the following command.
kubectl get nodes -o wide\n
It should return something like the following.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nhostname NotReady control-plane 3m17s v1.25.3 192.168.7.187 <none> Ubuntu 22.04.1 LTS 5.15.0-52-generic containerd://1.6.9\n
"},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n
It should return the following strings.
namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
"},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"Now when you see the status of the nodes, you will see that the master-node is ready :
kubectl get nodes -o wide\n
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nHostname Ready control-plane 4m12s v1.25.3 192.168.7.187 <none> Ubuntu 22.04.1 LTS 5.15.0-52-generic containerd://1.6.9\n
At this step, there is no more Taints
and your node is Ready
.
Next step, continue with the setup abcdesktop for kubernetes.
"},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":"x86-64
(arm-64
is not yet available)gimp
, libreoffice writer
, libreoffice calc
, libreoffice math
, libreoffice impress
, firefox
) and core image services.$ kubectl version --output=yaml\n
serverVersion:\n buildDate: \"2022-05-24T12:18:48Z\"\n compiler: gc\n gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n gitTreeState: clean\n gitVersion: v1.24.1\n goVersion: go1.18.2\n major: \"1\"\n minor: \"24\"\n platform: linux/amd64\n
kubernetes pod
ephemeral container
. Read more informations about on ephermeral container
microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.
"},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"$ microk8s kubectl version --output=yaml\nclientVersion:\n buildDate: \"2022-09-28T14:42:45Z\"\n compiler: gc\n gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n gitTreeState: clean\n gitVersion: v1.24.6-2+949b88ddc8b8cc\n goVersion: go1.18.5\n major: \"1\"\n minor: 24+\n platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n buildDate: \"2022-09-28T14:40:13Z\"\n compiler: gc\n gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n gitTreeState: clean\n gitVersion: v1.24.6-2+949b88ddc8b8cc\n goVersion: go1.18.5\n major: \"1\"\n minor: 24+\n platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns
add one to microk8s
","text":"$ microk8s enable dns\n
You should ready on stdout
$ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n
Check microk8s status
$ microk8s status\nmicrok8s is running\nhigh-availability: no\n datastore master nodes: 127.0.0.1:19001\n datastore standby nodes: none\naddons:\n enabled:\n dns # (core) CoreDNS\n ha-cluster # (core) Configure high availability on the current node\n
"},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"images support only architectures x86-64
. The architectures supported by this image is:
The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)
"},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshootingnginx
errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-78578c879-bb8qq 1/1 Running 0 164m\nmongodb-od-5b4dd4765f-ptw2j 1/1 Running 0 164m\nnginx-od-788c97cdc9-b4gbq 0/1 CrashLoopBackOff 36 (57s ago) 164m\nopenldap-od-65759b74dc-tbvfg 1/1 Running 0 164m\npyos-od-7d5d9457cf-jw6nk 1/1 Running 0 164m\nspeedtest-od-c94b56c88-48cvq 1/1 Running 0 164m\n
The pod nginx-od-788c97cdc9-b4gbq
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n
Nginx has failed to start. There is an error in the configuration file.
We need to fix the nginx-config
ConfigMap in the yaml file.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.0\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n
Check that nginx pod has been updated and that the status is Running
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-666df64f4-whtng 1/1 Running 0 2m30s\n
Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.
Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log
kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n
Nginx returns an explicit error, the /etc/nginx/sites-enabled/default
file is wrong.
nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n
It's time to fix the nginx-config
ConfigMap in the yaml file.
pyos
errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-sw9n5 1/1 Running 0 90m\nmongodb-od-77c945467d-c47nl 1/1 Running 0 90m\nnginx-od-666df64f4-wf99b 1/1 Running 0 22m\nopenldap-od-5bbdd75864-m6qmh 1/1 Running 0 90m\npyos-od-57946b67c4-m5zc9 0/1 CrashLoopBackOff 5 (17s ago) 3m18s\nspeedtest-od-7f5484966f-kxkw4 1/1 Running 0 90m\n
The pod pyos-od-57946b67c4-m5zc9
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
It's time to fix the abcdesktop-config
ConfigMap.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name : pyos\n imagePullPolicy: Always\n image: abcdesktopio/oc.pyos:3.0\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n
Check that pyos pod is Running
kubectl get pods -l run=pyos-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npyos-od-6cd679d6b8-css9q 1/1 Running 0 5s\n
Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.
Run the command cd /var/pyos && ./od.py
kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n
od.py
command returns the same explicit error, the od.config
file is wrong.
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
We need to fix the abcdesktop-config
ConfigMap in the yaml file.
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"To uninstall abcdesktop. Choose run run the uninstall-3.0.sh
bash script using a curl or run step by step uninstall commands manually.
Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n
You should read on stdout
starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
"},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"Run the bash commands from the uninstall-3.0.sh
main content :
echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n
The last command kubectl delete namespace
can take few minutes.
Please wait for the output message:
abcdesktop is uninstalled\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"To retain user's home directory files, you can define
In most cases with managed providers, you do not need to create a Persistent Volume
, just a Persistent Volume Claim
. Even in a non-managed set up, the Persistent Volume
is generally created by the cluster administrator while Persistent Volume Claim
is used by the end-user. The Persistent Volume Claim
is namespaced ressource.
Persistent Volume Claim
support.Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume
and Persistent Volume Claim
.
ClusterRole
only if you need to create Persistent Volume
","text":"Persistent Volume
is a non-namespaced resource, so you need to update the pyos-role
to ClusterRole
to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]
- apiGroups: [\"\"]\n resources: [\"persistentvolumes\"]\n verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n
Update the default pyos role to ClusterRole
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume
and persistent volume claim
","text":"To define Persistent Volume
or Persistent Volume Claim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"To use desktop.persistentvolume
and desktop.persistentvolumeclaim
values, the desktop.homedirectorytype
must be set to persistentVolumeClaim
desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume
is optional","text":"desktop.persistentvolume
is optional and can be set to None
, else the type of desktop.persistentvolume
parameter must be a dict (dictionary).
If desktop.persistentvolume is None
then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.
If desktop.persistentvolume is a dict
then abcdesktop creates the persistent volume.
If you set desktop.persistentvolume
to None
, or if you create the persistent volume manualy, then you don't need to update the pyos role.
desktop.persistentvolumeclaim
","text":"The type of desktop.persistentvolumeclaim
is dictionary or a string.
If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim
must be defined as a dict
or a str
.
Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role
for pyos-role
.
if desktop.persistentvolume
option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName
value to the created persistent volume.
Get more information about PersistentVolume and PersistentVolumeClaim.
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Definedesktop.persistentvolumeclaim
as a string","text":"All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany
, else only one pod (the first one) will bound the pvc.
Create a persistent volume
kubectl get pv -n abcdesktop\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npv-nfs 10Gi RWX Retain Bound abcdesktop/homedir nfs-csi 3d22h\n
kubectl describe pv pv-nfs \nName: pv-nfs\nLabels: <none>\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/homedir\nReclaim Policy: Retain\nAccess Modes: RWX\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: nfs-server.default.svc.cluster.local/share##\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir\nEvents: <none>\n
Create a persistent volume claim
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nhomedir Bound pv-nfs 10Gi RWX nfs-csi 3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName: homedir\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: pv-nfs\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWX\nVolumeMode: Filesystem\nUsed By: fry-88a6e\n hermes-7d84b\nEvents: <none>\n
In the od.config file, set the values
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n
If you need to use subPath
desktop.persistentvolumeclaimforcesubpath: True\n
'subPath' is not supported for ephemeral container.
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Definedesktop.persistentvolumeclaim
as a dictionary","text":"in od.config file
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Replace mystorageclass
by storageclass of your cloud provider.
To list the storage classes
kubectl get storageclass\n
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec
and desktop.persistentvolumeclaim
","text":"Value defines inside {{ VALUE }}
is replaced by the templated value keys:
The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rulesThe uuid
have the same value for the persistent volume and for the persistent volume claim. uuid
can be use for naming the PVC or the PV, or on all string values.
desktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n },\n 'spec': {\n 'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n 'storageClassName': 'nfs-csi',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
The variables persistentvolumeclaim and persistentvolume become
desktop.persistentvolumeclaim: {\n 'metadata': {'name': 'planet-fry-1841f'}, \n 'spec': {\n 'volumeName': 'planet-fry-1841f', \n 'storageClassName': 'nfs-csi', \n 'resources': {\n 'requests': {'storage': '1Gi'}\n }, \n 'accessModes': ['ReadWriteOnce']\n }\n}\ndesktop.persistentvolume: {\n 'metadata': { 'name': 'planet-fry-1841f'}, \n 'spec': {\n 'storageClassName': 'nfs-csi', \n 'mountOptions': ['nfsvers=3'], \n 'capacity': {'storage': '10Gi'}, \n 'accessModes': ['ReadWriteOnce'], \n 'csi': {\n 'driver': 'nfs.csi.k8s.io', \n 'readOnly': False, \n 'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n 'volumeAttributes': {\n 'server': '192.168.7.101', \n 'share': '/volume1/homedir/fry'\n }\n }\n }\n}\n
"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim
is True.
The default value for desktop.removepersistentvolume
is False
.
During the remove desktop process, delete or not the persistent volume claim.
The default value for desktop.removepersistentvolumeclaim
is False
.
csi-driver-nfs
","text":"In this example, we use nfs protocol to share user home directory on each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaim
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistent volume claim features.desktop.persistentvolume
: create a new persistent volume.desktop.persistentvolumeclaim
create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'volumeName': '{{ provider }}-{{ userid }}',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Update the new config file and restart pyos
pods. Update the pyos role to allow
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
abcdesktop creates PV and PVC for you.
"},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Bound abcdesktop/planet-fry nfs-csi 2m58s\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound planet-fry 10Gi RWO nfs-csi 107s\n
Get the persistent volume claim's description
kubectl describe pvc planet-fry -n abcdesktop\nName: planet-fry\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-055f6\nEvents: <none>\n
Get the persistent volume description
kubectl describe pv planet-fry\nName: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/planet-fry\nReclaim Policy: Retain\nAccess Modes: RWO\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: 192.168.7.101#volume1#homedir#fry\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir/fry\nEvents: <none>\n
"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage
on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"Update od.config file with the options
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'do-block-storage',\n 'resources': {\n 'requests': {\n 'storage': '1Gi'\n }\n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n
Update the configmap
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to your abcdesktop service, you should read on the html page, the status
b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n
Read the new pod for fry the user fry
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nfry-0d805 4/4 Running 0 17m\nmemcached-od-5ff8844d56-lcn7p 1/1 Running 0 106m\nmongodb-od-77c945467d-97g8w 1/1 Running 0 106m\nnginx-od-7445969696-lpfhh 1/1 Running 0 106m\nopenldap-od-5bbdd75864-dprvl 1/1 Running 0 106m\npyos-od-7584db6787-chtdc 1/1 Running 0 19m\nspeedtest-od-7f5484966f-5pl6k 1/1 Running 0 106m\n
Read the pvc for fry
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound pvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO do-block-storage 17m\n
Read the pv for fry
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO Delete Bound abcdesktop/planet-fry do-block-storage 17m\n
"},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim
is False
","text":"When desktop.deletepersistentvolumeclaim
is True
and desktop.deletepersistentvolume
is False
, if you create manually the persistent volumes, you may have to patch the claimRef
of the persistent volumes to make it Available
again.
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Released abcdesktop/planet-fry nfs-csi 4m1 \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Available nfs-csi 8m\n
"},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04. km
is a command tools from https://github.com/jfv-opensource/kube-tools repository.
Clone kube-tools and run km --apply
as root.
git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n
kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.
Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309: retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
"},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n
You can read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-6dt28 1/1 Running 0 40s\nmongodb-od-77c945467d-r82kv 1/1 Running 0 40s\nnginx-od-7445969696-6z88w 1/1 Running 0 40s\nopenldap-od-5bbdd75864-d5bpq 1/1 Running 0 38s\npyos-od-7584db6787-vnp64 1/1 Running 0 39s\nspeedtest-od-7f5484966f-jsb2m 1/1 Running 0 39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
You may need to replace the default namespace abcdesktop
by your own. The install-3.1.sh
bash script allow you to set the new namespace as an option.
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n
Run install-3.1.sh
./install-3.1.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-b75fb 1/1 Running 0 20s\nmongodb-od-77c945467d-t8cv7 1/1 Running 0 20s\nnginx-od-b8c8c7b95-lkjl6 1/1 Running 0 20s\nopenldap-od-56b6564c85-2npln 1/1 Running 0 18s\npyos-od-67dfc48d84-kww9n 1/1 Running 0 20s\nspeedtest-od-894b7c886-69vc4 1/1 Running 0 20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. The container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main configuration file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n
You should read on the standard output
role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 18s\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 18s\nnginx-od-7445969696-mwlc9 1/1 Running 0 18s\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 18s\npyos-od-7584db6787-tjlvk 1/1 Running 0 18s\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 18s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Also, you can run again the command
kubectl get pods -n abcdesktop\n
You should see that the anonymous-XXXXX
pod have been created and is Running
NAME READY STATUS RESTARTS AGE\nanonymous-50b0f 4/4 Running 0 5m22s\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 77m\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 77m\nnginx-od-7445969696-mwlc9 1/1 Running 0 77m\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 77m\npyos-od-7584db6787-tjlvk 1/1 Running 0 77m\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 77m\n
Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.1.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1
curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n
To inspect image json you can also run crictl inspecti
or docker inspect
command.
crictl inspecti abcdesktopio/2048.d:3.1 > 2048.json
docker inspect abcdesktopio/2048.d:3.1 > 2048.json
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json
file to the images REST endpoint
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshootingnginx
errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-78578c879-bb8qq 1/1 Running 0 164m\nmongodb-od-5b4dd4765f-ptw2j 1/1 Running 0 164m\nnginx-od-788c97cdc9-b4gbq 0/1 CrashLoopBackOff 36 (57s ago) 164m\nopenldap-od-65759b74dc-tbvfg 1/1 Running 0 164m\npyos-od-7d5d9457cf-jw6nk 1/1 Running 0 164m\nspeedtest-od-c94b56c88-48cvq 1/1 Running 0 164m\n
The pod nginx-od-788c97cdc9-b4gbq
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n
Nginx has failed to start. There is an error in the configuration file.
We need to fix the nginx-config
ConfigMap in the yaml file.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.1\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n
Check that nginx pod is Running
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-666df64f4-whtng 1/1 Running 0 2m30s\n
Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.
Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log
kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n
Nginx returns an explicit error, the /etc/nginx/sites-enabled/default
file is wrong.
nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n
It's time to fix the nginx-config
ConfigMap in the yaml file.
pyos
errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-sw9n5 1/1 Running 0 90m\nmongodb-od-77c945467d-c47nl 1/1 Running 0 90m\nnginx-od-666df64f4-wf99b 1/1 Running 0 22m\nopenldap-od-5bbdd75864-m6qmh 1/1 Running 0 90m\npyos-od-57946b67c4-m5zc9 0/1 CrashLoopBackOff 5 (17s ago) 3m18s\nspeedtest-od-7f5484966f-kxkw4 1/1 Running 0 90m\n
The pod pyos-od-57946b67c4-m5zc9
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
It's time to fix the abcdesktop-config
ConfigMap.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name : pyos\n imagePullPolicy: Always\n image: abcdesktopio/oc.pyos:3.1\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n
Check that pyos pod is Running
kubectl get pods -l run=pyos-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npyos-od-6cd679d6b8-css9q 1/1 Running 0 5s\n
Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.
Run the command cd /var/pyos && ./od.py
kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n
od.py
command returns the same explicit error, the od.config
file is wrong.
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
We need to fix the abcdesktop-config
ConfigMap in the yaml file.
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"To uninstall abcdesktop. Choose run run the uninstall-3.A.sh
bash script using a curl.
Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n
You should read on stdout
abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n
Please wait for the output message:
[OK] namespace \"abcdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n
Run the uninstall-3.1.sh command line with your own namespace
./uninstall-3.1.sh --namespace superdesktop\n
You should read on stdout
abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.
"},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"To retain user's home directory files, you can define
In most cases with managed providers, you do not need to create a Persistent Volume
, just a Persistent Volume Claim
. Even in a non-managed set up, the Persistent Volume
is generally created by the cluster administrator while Persistent Volume Claim
is used by the end-user. The Persistent Volume Claim
is namespaced ressource.
Persistent Volume Claim
support.Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume
and Persistent Volume Claim
.
ClusterRole
only if you need to create Persistent Volume
","text":"Persistent Volume
is a non-namespaced resource, so you need to update the pyos-role
to ClusterRole
to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]
- apiGroups: [\"\"]\n resources: [\"persistentvolumes\"]\n verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n
Update the default pyos role to ClusterRole
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume
and persistent volume claim
","text":"To define Persistent Volume
or Persistent Volume Claim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"To use desktop.persistentvolume
and desktop.persistentvolumeclaim
values, the desktop.homedirectorytype
must be set to persistentVolumeClaim
desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume
is optional","text":"desktop.persistentvolume
is optional, the default value is None
. desktop.persistentvolume
can be None
, or a string
or a dict
.
If desktop.persistentvolume is None
then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.
If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.
If desktop.persistentvolume is a dict
then abcdesktop creates the persistent volume. The dict
values of persistent volume support template values.
For example :
desktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
If you set desktop.persistentvolume
to None
, or if you create the persistent volume manualy, then you don't need to update the pyos role.
desktop.persistentvolumeclaim
","text":"desktop.persistentvolumeclaim
is optional, the default value is None
. The type of desktop.persistentvolumeclaim
can be None
, or a string
or a dict
.
If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim
must be defined as a dict
or a string
.
Kubernetes persistent volume is a namespaced resource
, so you can keep the default rbac-role
for pyos-role
.
if desktop.persistentvolume
option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName
value to the created persistent volume.
Get more information about PersistentVolume and PersistentVolumeClaim.
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Definedesktop.persistentvolumeclaim
as a string","text":"All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany
, else only one pod (the first one) will bound the pvc.
Create a persistent volume
kubectl get pv -n abcdesktop\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npv-nfs 10Gi RWX Retain Bound abcdesktop/homedir nfs-csi 3d22h\n
kubectl describe pv pv-nfs \nName: pv-nfs\nLabels: <none>\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/homedir\nReclaim Policy: Retain\nAccess Modes: RWX\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: nfs-server.default.svc.cluster.local/share##\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir\nEvents: <none>\n
Create a persistent volume claim
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nhomedir Bound pv-nfs 10Gi RWX nfs-csi 3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName: homedir\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: pv-nfs\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWX\nVolumeMode: Filesystem\nUsed By: fry-88a6e\n hermes-7d84b\nEvents: <none>\n
In the od.config file, set the values
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n
If you need to use subPath
desktop.persistentvolumeclaimforcesubpath: True\n
'subPath' is not supported for ephemeral container.
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Definedesktop.persistentvolumeclaim
as a dictionary","text":"in od.config file
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Replace mystorageclass
by storageclass of your cloud provider.
To list the storage classes
kubectl get storageclass\n
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec
and desktop.persistentvolumeclaim
","text":"Value defines inside {{ VALUE }}
is replaced by the templated value keys:
The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rulesThe uuid
have the same value for the persistent volume and for the persistent volume claim. uuid
can be use for naming the PVC or the PV, or on all string values.
desktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n },\n 'spec': {\n 'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n 'storageClassName': 'nfs-csi',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
The variables persistentvolumeclaim and persistentvolume become
desktop.persistentvolumeclaim: {\n 'metadata': {'name': 'planet-fry-1841f'}, \n 'spec': {\n 'volumeName': 'planet-fry-1841f', \n 'storageClassName': 'nfs-csi', \n 'resources': {\n 'requests': {'storage': '1Gi'}\n }, \n 'accessModes': ['ReadWriteOnce']\n }\n}\ndesktop.persistentvolume: {\n 'metadata': { 'name': 'planet-fry-1841f'}, \n 'spec': {\n 'storageClassName': 'nfs-csi', \n 'mountOptions': ['nfsvers=3'], \n 'capacity': {'storage': '10Gi'}, \n 'accessModes': ['ReadWriteOnce'], \n 'csi': {\n 'driver': 'nfs.csi.k8s.io', \n 'readOnly': False, \n 'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n 'volumeAttributes': {\n 'server': '192.168.7.101', \n 'share': '/volume1/homedir/fry'\n }\n }\n }\n}\n
"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim
is True.
The default value for desktop.removepersistentvolume
is False
.
During the remove desktop process, delete or not the persistent volume claim.
The default value for desktop.removepersistentvolumeclaim
is False
.
csi-driver-nfs
","text":"In this example, we use nfs protocol to share user home directory on each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaim
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistent volume claim features.desktop.persistentvolume
: create a new persistent volume.desktop.persistentvolumeclaim
create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'volumeName': '{{ provider }}-{{ userid }}',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Update the new config file and restart pyos
pods. Update the pyos role to allow
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
abcdesktop creates PV and PVC for you.
"},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Bound abcdesktop/planet-fry nfs-csi 2m58s\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound planet-fry 10Gi RWO nfs-csi 107s\n
Get the persistent volume claim's description
kubectl describe pvc planet-fry -n abcdesktop\nName: planet-fry\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-055f6\nEvents: <none>\n
Get the persistent volume description
kubectl describe pv planet-fry\nName: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/planet-fry\nReclaim Policy: Retain\nAccess Modes: RWO\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: 192.168.7.101#volume1#homedir#fry\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir/fry\nEvents: <none>\n
"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage
on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"Update od.config file with the options
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'do-block-storage',\n 'resources': {\n 'requests': {\n 'storage': '1Gi'\n }\n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n
Update the configmap
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to your abcdesktop service, you should read on the html page, the status
b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n
Read the new pod for fry the user fry
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nfry-0d805 4/4 Running 0 17m\nmemcached-od-5ff8844d56-lcn7p 1/1 Running 0 106m\nmongodb-od-77c945467d-97g8w 1/1 Running 0 106m\nnginx-od-7445969696-lpfhh 1/1 Running 0 106m\nopenldap-od-5bbdd75864-dprvl 1/1 Running 0 106m\npyos-od-7584db6787-chtdc 1/1 Running 0 19m\nspeedtest-od-7f5484966f-5pl6k 1/1 Running 0 106m\n
Read the pvc for fry
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound pvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO do-block-storage 17m\n
Read the pv for fry
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO Delete Bound abcdesktop/planet-fry do-block-storage 17m\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath
","text":"desktop.persistentvolumeclaimforcesubpath
is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath
is False
If desktop.persistentvolumeclaimforcesubpath
is set to True
then persistentvolumeclaim
is mounted with the subPath
option.
Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath
to True
.
If you try to start an ephemeral container application, you get an error code 422
and the message
{ \n \"reason\":\"FieldValueForbidden\",\n \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
"},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath
option","text":"In this case :
192.168.7.101
) exports /volume1/home
We create the unique PersistentVolume
named pv-nfs
.
---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n annotations:\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n name: pv-nfs\nspec:\n capacity:\n storage: 10Gi\n accessModes:\n - ReadWriteMany\n persistentVolumeReclaimPolicy: Retain\n storageClassName: nfs-csi\n mountOptions:\n - nfsvers=3\n csi:\n driver: nfs.csi.k8s.io\n readOnly: false\n # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n # make sure this value is unique for every share in the cluster\n volumeHandle: nfs-server.default.svc.cluster.local/share##\n volumeAttributes:\n server: 192.168.7.101\n share: /volume1/home\n---\n
accessModes is ReadWriteMany
for the PersistentVolume
We create the unique PersistentVolumeClaim
named pvc-nfs-homedir
---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n name: pvc-nfs-homedir\n namespace: abcdesktop\nspec:\n accessModes:\n - ReadWriteMany\n resources:\n requests:\n storage: 10Gi\n volumeName: pv-nfs\n storageClassName: nfs-csi\n---\n
accessModes is ReadWriteMany
for the PersistentVolumeClaim
We define in od.config file
desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n
All pods share the same PersistentVolumeClaim
named pvc-nfs-homedir
, the desktop.persistentvolumeclaimforcesubpath
is set to True
, the subPath value is set with the default of the current LDAP userid
. So the user's home directory is /volume1/home/{{ userid }}
. The nfs server allows user to access subfolders, the mount operation is permitted.
desktop.deletepersistentvolumeclaim
is False
","text":"When desktop.deletepersistentvolumeclaim
is True
and desktop.deletepersistentvolume
is False
, if you create manually the persistent volumes, you may have to patch the claimRef
of the persistent volumes to make it Available
again.
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Released abcdesktop/planet-fry nfs-csi 4m1 \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Available nfs-csi 8m\n
"},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"Play sound from a container to web browser using WebRTC
"},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":"Read the introduction to WebRTC protocols
You need a STUN server. You can use any STUN server like stun.l.google.com:19302. Session Traversal Utilities for NAT (STUN) is a protocol to discover your public address and determine any restrictions in your router that would prevent a direct connection with a peer.
You need your own TURN server. We use COTURN server as describe in this chapter. Traversal Using Relays around NAT (TURN) is meant to bypass the Symmetric NAT restriction by opening a connection with a TURN server and relaying all information through that server.
abcdesktop/pulseaudio:3.2
container executes the following services
STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.
The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good
{ 'urls': 'stun:stun.l.google.com:19302' }\n
"},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.
You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.
"},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.
apt-get install coturn \n
You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.
Default minimal configuration file /etc/turnserver.conf
for abcdesktop.
listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n
Update the following configuration file with you own values
static-auth-secret
server-name
realm
cert
pkey
Then start your turn service.
"},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmapod.config
file","text":"Add new webrtc's entries
webrtc.enable
to True
webrtc.rtc_configuration
dictionary for the web browser webrtc stackwebrtc.coturn
dictionnay entries for the web browser webrtc stackcoturn_static_auth_secret
is the static-auth-secret
value define in turnserver.conf
filettl
define the time to live for the auth value protocol
define the Traversal Using Relays around NAT protocol, value can be turn
or turns
url
url for the coturn servicewebrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n 'coturn_static_auth_secret': 'CHANGEME', \n 'ttl':3600,\n 'protocol': 'turns',\n 'url': 'turn.domain.local:3478' }\n
pyos merges a new rtc_configuration
json document from the webrtc.coturn
and from webrtc.coturn
values.
pyos adds username
and credential
entries. For example, a new rtc_configuration
json document is send to the web browser
{\n \"iceServers\": [\n { \"urls\": \"stun:stun.l.google.com:19302\" },\n { \"urls\": \"turns:nturns.domain.local:3478\",\n \"username\": \"1703086872\",\n \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n ]\n}\n
desktop.envlocal
to add STUN_SERVER
STUN_SERVER value is used by the gstreamer webrtcbin
desktop.envlocal : { \n 'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n
sound
entry in desktop.pod
to enable pulseaudio
service Update the value 'enable': False
to 'enable': True
desktop.pod : \n\n ...[CUT HERE ]...\n\n'sound': { \n 'image': 'abcdesktopio/oc.pulseaudio:3.2',\n 'pullpolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 4714,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"8Mi\", 'cpu': \"50m\" }, \n 'limits' : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n } },\n\n ...[CUT HERE ]...\n\n
abcdesktop-config
for the od.config
filekubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
kubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"Open your web browser, and go to your abcdesktop web site.
Make sure to use secured https protocol, else WebRTC is disabled.
"},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"Login using credentials, for example
The sound is not yet available
"},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"Few seconds later, sound becomes available.
The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.
"},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"Open a Terminal Web Shell
application and run the command inside the web shell
paplay /usr/share/sounds/alsa/Rear_Center.wav \n
You should heard Rear Center
on your local sound device
Open a Terminal Web Shell
application and run the command inside the web shell
pavumeter --record\n
You should see cursor changes if you talk to your abcdesktop
"},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"Open the web browser's console log to read the WebRTC messages
Read the json rtc_configuration document created by pyos pod
Read the step Created peer connection for call and creating SDP
and step Exchange from foundation
for 1 to 6
Read the step Exchange from foundation
from 6 to 9
Read the step Local stream answer
The last line is ICE Candidate was null, done
The sound is now enabled
"},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04. km
is a command tools from https://github.com/jfv-opensource/kube-tools repository.
Clone kube-tools and run km --apply
as root.
git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n
kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.
Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309: retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
Linux operating system is recommanded to run abcdesktop.io.
"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows
"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n
You can read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-6dt28 1/1 Running 0 40s\nmongodb-od-77c945467d-r82kv 1/1 Running 0 40s\nnginx-od-7445969696-6z88w 1/1 Running 0 40s\nopenldap-od-5bbdd75864-d5bpq 1/1 Running 0 38s\npyos-od-7584db6787-vnp64 1/1 Running 0 39s\nspeedtest-od-7f5484966f-jsb2m 1/1 Running 0 39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
You may need to replace the default namespace abcdesktop
by your own during the install process. The install-3.2.sh
bash script allow you to set the new namespace as an option.
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n
Run install-3.2.sh
./install-3.2.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-b75fb 1/1 Running 0 20s\nmongodb-od-77c945467d-t8cv7 1/1 Running 0 20s\nnginx-od-b8c8c7b95-lkjl6 1/1 Running 0 20s\nopenldap-od-56b6564c85-2npln 1/1 Running 0 18s\npyos-od-67dfc48d84-kww9n 1/1 Running 0 20s\nspeedtest-od-894b7c886-69vc4 1/1 Running 0 20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. The container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main configuration file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n
You should read on the standard output
role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 18s\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 18s\nnginx-od-7445969696-mwlc9 1/1 Running 0 18s\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 18s\npyos-od-7584db6787-tjlvk 1/1 Running 0 18s\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 18s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Also, you can run again the command
kubectl get pods -n abcdesktop\n
You should see that the anonymous-XXXXX
pod have been created and is Running
NAME READY STATUS RESTARTS AGE\nanonymous-50b0f 4/4 Running 0 5m22s\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 77m\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 77m\nnginx-od-7445969696-mwlc9 1/1 Running 0 77m\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 77m\npyos-od-7584db6787-tjlvk 1/1 Running 0 77m\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 77m\n
Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.2.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"Quick installation can be run on Windows operation system.
Download and execute the pullapps-3.2.ps1
script :
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2
curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.2.json --output 2048.json\n
To inspect image json you can also run crictl inspecti
or docker inspect
command.
crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
docker inspect abcdesktopio/2048.d:3.2 > 2048.json
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json
file to the images REST endpoint
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"Quick installation can be run on Windows operation system.
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"To run abcdesktop on Microsoft Windows plateform you need to use docker desktop
Start Docker Desktop
and wait for the docker engine to start.
Once started go to the Settings | Kubernetes
and click on Enable Kubernetes
, starting your cluster may take a while.
Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version
kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"abcdesktop install process creates RSA keys using openssl, you need to install openssl
command line.
Download the OpenSSL v3.2.0 Light executable file.
Then follow the install process.
Make sure to keep in mind the path where OpenSSL will be installed.
Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".
Go to the system variables section and search for Path
Click on Edit
and add a new Path
, you have to paste the absolute path to the bin folder of OpenSSL.
Now OpenSSL
should be correctly installed, you can check it by opening a new PowerShell and run the command
openssl version\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"Download and extract the latest release automatically (Windows):
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n
You should read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-x89kq 1/1 Running 0 11s\nmongodb-od-77c945467d-c5cw4 1/1 Running 0 11s\nnginx-od-86c5dfcc67-nfvbq 1/1 Running 0 11s\nopenldap-od-5bbdd75864-mzzmh 1/1 Running 0 11s\npyos-od-7646bf4786-c2hdm 1/1 Running 0 11s\nspeedtest-od-7f5484966f-6t4b2 1/1 Running 0 11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
You can open a web browser and go to the http://localhost:30443/
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"You may need to replace the default namespace abcdesktop
by your own. The install-3.2.ps1
PowerShell script allows you to set the new namespace as an option.
curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/install-3.2.ps1 -OutFile install-3.2.ps1\n
Run install-3.2.ps1
.\\install-3.2.ps1 --namespace superdesktop\n
You should read on stdout
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-98t4t 1/1 Running 0 23s\nmongodb-od-77c945467d-v4k58 1/1 Running 0 23s\nnginx-od-7c7bf5bf48-khtvg 1/1 Running 0 23s\nopenldap-od-56b6564c85-t56tj 1/1 Running 0 21s\npyos-od-644c98bcd5-8gqzd 1/1 Running 0 23s\nspeedtest-od-894b7c886-fgt6v 1/1 Running 0 23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
You can open a web browser and go to the http://localhost:30443/
"},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"To uninstall abcdesktop. Choose run run the uninstall-3.2.sh
bash script using a curl.
If you are using a Windows operating system please click on the link below Quick uninstall for windows
"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n
You should read on stdout
abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n
Please wait for the output message:
[OK] namespace \"abcdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n
Run the uninstall-3.2.sh
command line with your own namespace
./uninstall-3.2.sh --namespace superdesktop\n
You should read on stdout
abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.
"},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"Quick uninstallation can be run on Windows operation system.
Download and extract the uninstall PowerShell script (Windows):
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
You should read on stdout
[INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n
Run the uninstall-3.2.ps1
command line with your own namespace
.\\uninstall-3.2.ps1 --namespace superdesktop\n
You should read on stdout
[INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":"Alexandre DEVELY : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base
Cedric HAUWEL : Control Plane PyOS
and authentification, included a complete refactor of the control plane
Jeremy PETIT : HTML, CSS, Javascript, nodejs: Full Stack Javascript Developer
Kevin VOYER : HTML, CSS, Javascript, Firefox clipboard extension, nodejs : Full Stack Javascript Developer
Vincent PENVERN : Python, Ansible, Firefox clipboard extension, Pyos and embedded applications
Jean-Philippe XAVIER: Architect, design and network policies with calico
The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log
for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.
Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
"},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
"},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
"},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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 \u201cAS IS\u201d 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.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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.
END OF TERMS AND CONDITIONS
"},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"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 convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year> <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n
The hypothetical commands show w
and show c
should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w
and show c
; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n
This 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.
"},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.
We recommend you to start in docker mode
first with the Setup Guide in docker mode.
Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide
You can also, read the genesis chapters GUI apps on Docker
.
Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.
"},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.
Topics include:
This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.
Topics include:
abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :
Operating System Recommended versionGNU/Linux
Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X
Catalina version 10.15.3 (and above) Windows 10
Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop
or server
","text":"server
, please translate the URL
request http://localhost
with the hostname of your server. For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL
request http://localhost
with http://server01.labs.domain.local
Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.
desktop
, the URL
request http://localhost
will reach your local services.abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.
Follow the Fork me on github links, to get access to each repository.
If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.
"},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"abcdesktop.io deplend on a lot of open source diffrents projets.
"},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.
As VNC does not support sound, we have to forward a Pulseaudio null-sink
output to the user browser, with no latency.
Release 1.0 : use the pulseaudio http stream and play wave data (poor sound quality but works in https only)
Release 2.0 : use janus webrtc gateway, send pulseaudio rtp stream to janus, and play sound using the web browser webrtc stack (good sound quality)
Release 3.0 : use virtual microphone using gstreamer and pulseaudio
Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented
"},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"webaudio-wav-stream-player No latency wav stream player using browser fetch streaming API and WebAudio
Pulseaudio with module-http-protocol-tcp A proof-of-concept HTTP module, which can be used to introspect the current status of the PulseAudio daemon using HTTP. Just load this module and point your browser to http://localhost:4714/. This module takes the same arguments as module-cli-protocol-tcp.
Create Pulseaudio null-sink
# defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n
Then use
load-module module-http-protocol-tcp\n
Read the http stream data, using fetch call :
$target
is the container Ip Address$pulseaudio_http_port
is the pulseaudio http port ( by default, the http port vallue ishttp://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n
Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js
file :
//\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n // // total header : 4 + 26 + 12 + 8 = 50 \n // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n var total_length = header_length + data.byteLength;\n\n // bitsPerSample MUST BE 8 bits\n\n // The default byte ordering assumed for WAVE data files is little-endian.\n var header = new ArrayBuffer(header_length); \n var d = new DataView(header);\n\n d.setUint8(0, \"R\".charCodeAt(0)); \n d.setUint8(1, \"I\".charCodeAt(0));\n d.setUint8(2, \"F\".charCodeAt(0));\n d.setUint8(3, \"F\".charCodeAt(0));\n\n // All integers MUST be set in bigEndian format\n // Wave chunks containing format information and sampled data\n // cksize 4 Chunk size: 4+n \n // 4: for sizeof( 'WAVE' ) + n \n // n: Wave chunks containing format information and sampled data\n //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n //bitsPerSample data.byteLength + 8+16+12\n d.setUint32(4, total_length, true); \n\n // write 4 bytes\n d.setUint8(8, \"W\".charCodeAt(0)); \n d.setUint8(9, \"A\".charCodeAt(0)); \n d.setUint8(10, \"V\".charCodeAt(0)); \n d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n // write 4 bytes\n d.setUint8(12, \"f\".charCodeAt(0));\n d.setUint8(13, \"m\".charCodeAt(0));\n d.setUint8(14, \"t\".charCodeAt(0));\n d.setUint8(15, \" \".charCodeAt(0));\n\n\n // All integers MUST be set in bigEndian format\n\n\n // Subchunk1Size 16 for PCM. \n // Offset 16 \n // Size 4\n // This is the size of the rest of the Subchunk which follows this number.\n // The size of the rest of this subchunk.\n // All integers MUST be set in bigEndian format\n // d.setUint32(16, 16, true);\n // cksize 4 Chunk size: 16, 18 or 40 \n var chunksize = 18;\n d.setUint32(16, chunksize, true);\n\n // The format of the wave data, which will be 1 for uncompressed PCM data.\n // All integers MUST be set in bigEndian format\n // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n d.setUint16(20, format, true);\n\n // Indicates if the data is mono, stereo, or something else.\n // NumChannels Mono = 1, Stereo = 2, etc.\n // All integers MUST be set in bigEndian format\n d.setUint16(22, numberOfChannels, true);\n\n // The sample rate per second.\n // SampleRate 8000, 44100, etc.\n // All integers MUST be set in bigEndian format\n d.setUint32(24, sampleRate, true);\n\n // byteRate == SampleRate * NumChannels * BitsPerSample/8\n // All integers MUST be set in bigEndian format\n var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n d.setUint32(28, byteRate, true ); \n\n // blockAlign == NumChannels * BitsPerSample/8\n // The number of bytes for one sample including all channels.\n var blockAlign = numberOfChannels * bitsPerSample / 8; \n // All integers MUST be set in bigEndian format\n d.setUint16(32, blockAlign, true ); \n\n // BitsPerSample 8 bits = 8, 16 bits = 16, etc.\n d.setUint16(34, bitsPerSample, true);\n\n // Wave files may include an additional field, usually reserved for non-PCM formats:\n // bits per Sample \n // Size of the extension \n // 2 bytes\n // Offset \n var cbSize = 0;\n d.setUint16(36, cbSize, true);\n\n d.setUint8(38, \"f\".charCodeAt(0));\n d.setUint8(39, \"a\".charCodeAt(0));\n d.setUint8(40, \"c\".charCodeAt(0));\n d.setUint8(41, \"t\".charCodeAt(0));\n var cksize = 4;\n d.setUint32(42, cksize, true);\n var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n d.setUint32(46, dwSampleLength, true);\n\n// 50\n d.setUint8(50, \"d\".charCodeAt(0));\n d.setUint8(51, \"a\".charCodeAt(0));\n d.setUint8(52, \"t\".charCodeAt(0));\n d.setUint8(53, \"a\".charCodeAt(0));\n\n d.setUint32(54, data.byteLength, true);\n\n//58\n // data must pad byte 0 or 1 if n is odd\n return concat(header, data);\n}\n
Then use the WavPlayer.js
from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()
This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10
It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.
"},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"Janus WebRTC Gateway with ICE server. Janus act as WebRTC gateway, listen for udp RTP stream from Pulseaudio and forward it to user web browser.
Pulseaudio with module-rtp-send Create a null-sink formated alaw and send it to the WebRTC gateway udp port on localhost.
### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n
Add a RTP stream to Janus WebRTC gateway
[pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n
Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC
"},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"The current documentation version is 0.1
"},{"location":"about/version/#location","title":"Location","text":"This documentation is located at https://github.com/abcdesktopio/docs
"},{"location":"about/version/#installing-make","title":"Installing Make","text":"Install the Make package using apt-get
sudo apt-get install make\n
"},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"Install the mkdocs package using the Makefile
:
make install\n
make install
command runs :
Make sure that the pip command is installed on you system.
"},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO - Cleaning site directory \nINFO - Building documentation to directory: /home/alex/src/docs/opsdocs/site \n
All HTML files are located in the building documentation directory
"},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"make serve\nINFO - Serving on http://127.0.0.1:8000\nINFO - Start watching changes\nINFO - Start detecting changes\n
Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.
"},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"{\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}
https://ocv5.pepins.net/API/composer/launchdesktop
{\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}
"},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/
"},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"DockerFile generator from json file to build applications images run commands
$ make dockerfile\n$ make build\n
this command build all generated Dockerfile
To build documentation files
$ make docs\n
this command build all md files, and build list.md
"},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"gnome-2048\n
"},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"2048 (alpine gtk) with error\n
"},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"org.gnome.TwentyFortyEight.Gnome-2048\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"pod_application\",\n \"apkpackage\": \"gnome-2048\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n \"name\": \"2048-alpine-error\",\n \"displayname\": \"2048 (alpine gtk) with error\",\n \"path\": \"/usr/bin/gnome-2048\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n }\n}\n
"},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-alpine-error
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
"},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
"},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"gnome-2048\n
"},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"2048 (alpine gtk)\n
"},{"location":"applications/2048-alpine/#path","title":"Path","text":"/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"org.gnome.TwentyFortyEight.Gnome-2048\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"json source file 2048-alpine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"ephemeral_container\",\n \"apkpackage\": \"gnome-2048\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n \"name\": \"2048-alpine\",\n \"displayname\": \"2048 (alpine gtk)\",\n \"path\": \"/usr/bin/gnome-2048\",\n \"showinview\": \"dock\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"64M\",\n \"pid_mode\": false,\n \"network_mode\": \"none\"\n }\n}\n
"},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
"},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-alpine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
"},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
"},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
"},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"2048-qt\n
"},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"2048 (ubuntu qt)\n
"},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"/usr/games/2048-qt\n
"},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"2048-qt.2048-qt\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/2048-qt.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
ENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"json source file 2048-ubuntu.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"pod_application\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048-ubuntu\",\n \"displayname\": \"2048 (ubuntu qt)\",\n \"path\": \"/usr/games/2048-qt\",\n \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"postruncommands\": [\n \"ENV QT_X11_NO_MITSHM=1\"\n ]\n}\n
"},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
"},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-ubuntu
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
"},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
"},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
"},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"2048-qt
"},{"location":"applications/2048/#display-name","title":"Display name","text":"\"2048\"
"},{"location":"applications/2048/#path","title":"path","text":"\"/usr/games/2048-qt\"
"},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.22.04
"},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
"},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"
Apache Directory Studio\n
"},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
"},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"Apache Directory Studio.Apache Directory Studio\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
"},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"json source file apachedirectorystudio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n ],\n \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n \"icon\": \"account.svg\",\n \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n \"installrecommends\": true,\n \"keyword\": \"ldap\",\n \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n \"name\": \"apachedirectorystudio\",\n \"displayname\": \"Apache Directory Studio\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
"},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
"},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application apachedirectorystudio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
"},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
"},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
"},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"astromenace\n
"},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"astromenace\n
"},{"location":"applications/astromenace/#path","title":"Path","text":"/usr/games/AstroMenace\n
"},{"location":"applications/astromenace/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"Astromenace.Astromenace\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/astromenace.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"json source file astromenace.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"astromenace\",\n \"installrecommends\": true,\n \"icon\": \"astromenace.svg\",\n \"launch\": \"Astromenace.Astromenace\",\n \"name\": \"astromenace\",\n \"displayname\": \"astromenace\",\n \"path\": \"/usr/games/AstroMenace\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
"},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
"},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application astromenace
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
"},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
"},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
"},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"libxss1 atom aspell
"},{"location":"applications/atom/#arguments","title":"Arguments","text":"\"-f\"
"},{"location":"applications/atom/#display-name","title":"Display name","text":"\"Atom\"
"},{"location":"applications/atom/#path","title":"path","text":"\"/usr/bin/atom\"
"},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"\nRUN apt-get update && apt-get install --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/base/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/base/#arguments","title":"Arguments","text":"\"--base\"
Base\n
"},{"location":"applications/base/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/base/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
"},{"location":"applications/base/#file-extensions","title":"File extensions","text":"\"odb\"
\"odb\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-base\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-base.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/base/#json-dump","title":"JSON dump","text":"json source file base.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_base.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-base\",\n \"name\": \"base\",\n \"displayname\": \"Base\",\n \"args\": \"--base\",\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n \"fileextensions\": \"odb\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"legacyfileextensions\": \"odb\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
"},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application base
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
"},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f base.d -t base .\n
"},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
"},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"\"--no-sandbox\"
Beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"/opt/Beekeeper-Studio/beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"\"sql\"
\"sql\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"beekeeper-studio.beekeeper-studio\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/beekeeper-studio.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"json source file beekeeperstudio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\",\n \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n \"ENV ELECTRON_ENABLE_LOGGING=true\",\n \"ENV QT_X11_NO_MITSHM=1\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"beekeeper-studio.svg\",\n \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n \"launch\": \"beekeeper-studio.beekeeper-studio\",\n \"name\": \"beekeeperstudio\",\n \"displayname\": \"Beekeeper-studio\",\n \"installrecommends\": false,\n \"forceconfold\": true,\n \"host_config\": {\n \"shm_size\": \"2G\",\n \"ipc_mode\": \"shareable\"\n },\n \"args\": \"--no-sandbox\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"legacyfileextensions\": \"sql\",\n \"fileextensions\": \"sql\",\n \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
"},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application beekeeperstudio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
"},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
"},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
"},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/blender/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"blender mesa-dri-gallium\n
"},{"location":"applications/blender/#displayname","title":"Displayname","text":"Blender\n
"},{"location":"applications/blender/#path","title":"Path","text":"/usr/bin/blender\n
"},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"application/x-blender\n
"},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"\"blend,obj,fbx,3ds,ply,stl\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"Blender.Blender\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/blender.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"json source file blender.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,graphics\",\n \"apkpackage\": \"blender mesa-dri-gallium\",\n \"icon\": \"circle_blender.svg\",\n \"keyword\": \"blender,modeler\",\n \"launch\": \"Blender.Blender\",\n \"name\": \"blender\",\n \"displayname\": \"Blender\",\n \"path\": \"/usr/bin/blender\",\n \"mimetype\": \"application/x-blender\",\n \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
"},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
"},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application blender
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
"},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
"},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
"},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/bless/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"bless\n
"},{"location":"applications/bless/#path","title":"Path","text":"/usr/bin/bless\n
"},{"location":"applications/bless/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"bless.Bless\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/bless.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"json source file bless.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"bless\",\n \"icon\": \"circle_bless.svg\",\n \"keyword\": \"hexa,decimal\",\n \"launch\": \"bless.Bless\",\n \"name\": \"Bless\",\n \"path\": \"/usr/bin/bless\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
"},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
"},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Bless
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
"},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
"},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
"},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/blobby/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"blobby\n
"},{"location":"applications/blobby/#path","title":"Path","text":"/usr/games/blobby\n
"},{"location":"applications/blobby/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"blobby.blobby\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/blobby.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"json source file blobby.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"blobby\",\n \"icon\": \"blobby.svg\",\n \"installrecommends\": false,\n \"keyword\": \"game\",\n \"launch\": \"blobby.blobby\",\n \"name\": \"blobby\",\n \"path\": \"/usr/games/blobby\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
"},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
"},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application blobby
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
"},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
"},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
"},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/boxes/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"gnome-boxes sudo\n
"},{"location":"applications/boxes/#displayname","title":"Displayname","text":"Gnome-boxes\n
"},{"location":"applications/boxes/#path","title":"Path","text":"/usr/bin/gnome-boxes\n
"},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"application-x-cd-image;\n
"},{"location":"applications/boxes/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"gnome-boxes.Gnome-boxes\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Boxes.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"json source file boxes.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"org.gnome.Boxes.svg\",\n \"apkpackage\": \"gnome-boxes sudo\",\n \"keyword\": \"boxes,vm\",\n \"launch\": \"gnome-boxes.Gnome-boxes\",\n \"name\": \"boxes\",\n \"displayname\": \"Gnome-boxes\",\n \"path\": \"/usr/bin/gnome-boxes\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n \"mimetype\": \"application-x-cd-image;\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"securitycontext\": {\n \"allowPrivilegeEscalation\": true,\n \"capabilities\": {\n \"add\": [\n \"NET_ADMIN\",\n \"CAP_SYS_ADMIN\"\n ]\n }\n }\n}\n
"},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
"},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application boxes
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
"},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
"},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
"},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/brackets/#arguments","title":"Arguments","text":"\"--no-sandbox --disable-gpu\"
/opt/brackets/Brackets\n
"},{"location":"applications/brackets/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"brackets.Brackets\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/opt/brackets/brackets.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"json source file brackets.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"\",\n \"icon\": \"circle_brackets.svg\",\n \"keyword\": \"html,brackets\",\n \"launch\": \"brackets.Brackets\",\n \"name\": \"Brackets\",\n \"path\": \"/opt/brackets/Brackets\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"host_config\": {\n \"mem_limit\": \"512M\"\n },\n \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"args\": \"--no-sandbox --disable-gpu\"\n}\n
"},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
"},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Brackets
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
"},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
"},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
"},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/calc/#distribution","title":"Distribution","text":"alpine
"},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/calc/#arguments","title":"Arguments","text":"\"--calc\"
"},{"location":"applications/calc/#displayname","title":"Displayname","text":"\"Calc\"
"},{"location":"applications/calc/#path","title":"Path","text":"\"/usr/lib/libreoffice/program/soffice\"
"},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/calc/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"
"},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"
"},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"\"ods;ots;csv\"
"},{"location":"applications/calc/#acl","title":"ACL","text":"{\"permit\":[\"all\"]}
"},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-calc
"},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"/usr/share/applications/libreoffice-calc.desktop
"},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_calc.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-calc\",\n \"name\": \"calc\",\n \"displayname\": \"Calc\",\n \"showinview\": \"dock\",\n \"args\": \"--calc\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n \"legacyfileextensions\": \"ods;ots;csv\",\n \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/calculator/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"gnome-calculator\n
"},{"location":"applications/calculator/#path","title":"Path","text":"/usr/bin/gnome-calculator\n
"},{"location":"applications/calculator/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"gnome-calculator.gnome-calculator\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Calculator.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"json source file calculator.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"apkpackage\": \"gnome-calculator\",\n \"icon\": \"gnome_calculator.svg\",\n \"keyword\": \"calculator\",\n \"launch\": \"gnome-calculator.gnome-calculator\",\n \"name\": \"calculator\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-calculator\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
"},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
"},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application calculator
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
"},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
"},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
"},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/chess/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"gnuchess gnome-chess\n
"},{"location":"applications/chess/#path","title":"Path","text":"/usr/bin/gnome-chess\n
"},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"application/x-chess-pgn\n
"},{"location":"applications/chess/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"gnome-chess.gnome-chess\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Chess.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"json source file chess.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnuchess gnome-chess\",\n \"icon\": \"circle_chess.svg\",\n \"keyword\": \"chess gnuchess\",\n \"launch\": \"gnome-chess.gnome-chess\",\n \"name\": \"chess\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-chess\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-chess-pgn\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
"},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
"},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chess
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
"},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
"},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
"},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/chrome/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
"},{"location":"applications/chrome/#displayname","title":"Displayname","text":"Chrome\n
"},{"location":"applications/chrome/#path","title":"Path","text":"/usr/bin/google-chrome-stable\n
"},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"google-chrome.Google-chrome\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/google-chrome.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
"},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"json source file chrome.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n \"preruncommands\": [\n \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n ],\n \"icon\": \"circle_google-chrome.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"google-chrome.Google-chrome\",\n \"name\": \"chrome\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"Chrome\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/google-chrome-stable\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
"},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chrome
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
"},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
"},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
"},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/chromium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"chromium\n
"},{"location":"applications/chromium/#displayname","title":"Displayname","text":"chromium (alpine)\n
"},{"location":"applications/chromium/#path","title":"Path","text":"/usr/bin/chromium-browser\n
"},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"chromium.Chromium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/chromium-browser.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"json source file chromium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"chromium\",\n \"icon\": \"circle_chromium.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"chromium.Chromium\",\n \"name\": \"chromium\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"chromium (alpine)\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/chromium-browser\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
"},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chromium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
"},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
"},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
"},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/citrix/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
"},{"location":"applications/citrix/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/citrix/#arguments","title":"Arguments","text":"\"-icaroot /opt/Citrix/ICAClient\"
citrix-client\n
"},{"location":"applications/citrix/#path","title":"Path","text":"/opt/Citrix/ICAClient/wfica\n
"},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"application/x-ica;\n
"},{"location":"applications/citrix/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"Wfica.Wfica\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/wfica.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"json source file citrix.d.3.0.json
{\n \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"postruncommands\": [\n \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n \"icon\": \"icaclient.svg\",\n \"keyword\": \"ica,icaclient,\",\n \"launch\": \"Wfica.Wfica\",\n \"name\": \"citrix\",\n \"displayname\": \"citrix-client\",\n \"secrets_requirement\": \"citrix\",\n \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n \"path\": \"/opt/Citrix/ICAClient/wfica\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"mimetype\": \"application/x-ica;\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"512M\",\n \"pid_mode\": true,\n \"ipc_mode\": \"shareable\"\n },\n \"usedefaultapplication\": true,\n \"licence\": \"non-free\"\n}\n
"},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
"},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application citrix
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
"},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
"},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
"},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"cf8-cli\n
"},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"\"--disable-factory --class pivotalio.cf\"
Cloud Foundry cli\n
"},{"location":"applications/cloudfoundry/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.pivotalio.cf\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
"},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"json source file cloudfoundry.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n ],\n \"debpackage\": \"cf8-cli\",\n \"icon\": \"pivotalio-icon.svg\",\n \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n \"name\": \"cloudFoundry\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"displayname\": \"Cloud Foundry cli\",\n \"args\": \"--disable-factory --class pivotalio.cf\",\n \"quick\": true\n}\n
"},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
"},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cloudFoundry
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
"},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
"},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
"},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"cmd.exe wine (alpine)\n
"},{"location":"applications/cmd.exe/#path","title":"Path","text":"/usr/bin/wineconsole\n
"},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"conhost.exe.conhost.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"json source file cmd.exe.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"cmd.svg\",\n \"keyword\": \"wine,command,cmd.exe\",\n \"launch\": \"conhost.exe.conhost.exe\",\n \"name\": \"cmd.exe\",\n \"displayname\": \"cmd.exe wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/wineconsole\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
"},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cmd.exe
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
"},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
"},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
"},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
"},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"
cntlm\n
"},{"location":"applications/cntlm/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cntlm/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cntlm\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
COPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
"},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
"},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n \"icon\": \"cntlm.svg\",\n \"keyword\": \"cntlm,proxy,ntlm\",\n \"launch\": \"gnome-terminal-server.cntlm\",\n \"name\": \"cntlm\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"displayname\": \"cntlm\",\n \"host_config\": {\n \"network_mode\": \"container\"\n },\n \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n \"preruncommands\": [\n \"COPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\",\n \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n ],\n \"postruncommands\": [\n \"RUN chown balloon:root /etc/cntlm.conf\",\n \"RUN chmod 755 /composer/cntlm.mustache\"\n ]\n}\n
"},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cntlm
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
"},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
"},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"libgl1 corsix-th\n
"},{"location":"applications/corsix-th/#path","title":"Path","text":"/usr/games/corsix-th\n
"},{"location":"applications/corsix-th/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"corsix-th.corsix-th\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/com.corsixth.CorsixTH.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
"},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"json source file corsix-th.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n \"RUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n ],\n \"debpackage\": \"libgl1 corsix-th\",\n \"icon\": \"games.svg\",\n \"keyword\": \"hospital,role,playing\",\n \"launch\": \"corsix-th.corsix-th\",\n \"name\": \"corsix-th\",\n \"path\": \"/usr/games/corsix-th\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
"},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
"},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application corsix-th
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
"},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
"},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
"},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cuda/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git\n
"},{"location":"applications/cuda/#arguments","title":"Arguments","text":"\"--disable-factory --class=cuda\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cuda/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cuda\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"json source file cuda.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia\",\n \"launch\": \"gnome-terminal-server.cuda\",\n \"name\": \"cuda\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cuda\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
"},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cuda
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
"},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
"},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
"},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"
cuda demo\n
"},{"location":"applications/cudademo/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cudademo/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cudademo\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"json source file cudademo.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia\",\n \"launch\": \"gnome-terminal-server.cudademo\",\n \"name\": \"cudademo\",\n \"displayname\": \"cuda demo\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
"},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cudademo
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
"},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
"},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
"},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"\"--disable-factory --class=cudadev\"
cuda developper\n
"},{"location":"applications/cudadev/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cudadev/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cudadev\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
"},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"json source file cudadev.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia dev\",\n \"launch\": \"gnome-terminal-server.cudadev\",\n \"name\": \"cudadev\",\n \"displayname\": \"cuda developper\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cudadev\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n ]\n}\n
"},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
"},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cudadev
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
"},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
"},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
"},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/dia/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"dia dia-lang\n
"},{"location":"applications/dia/#path","title":"Path","text":"/usr/bin/dia\n
"},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"application/x-dia-diagram;\n
"},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"\"dia\"
\"dia\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"dia-gnome.Dia-gnome\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/dia.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"json source file dia.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"dia dia-lang\",\n \"installrecommends\": true,\n \"icon\": \"circle_dia.svg\",\n \"launch\": \"dia-gnome.Dia-gnome\",\n \"name\": \"Dia\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/dia\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-dia-diagram;\",\n \"fileextensions\": \"dia\",\n \"legacyfileextensions\": \"dia\",\n \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
"},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
"},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Dia
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
"},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
"},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
"},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/doom/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
"},{"location":"applications/doom/#displayname","title":"Displayname","text":"Doom\n
"},{"location":"applications/doom/#path","title":"Path","text":"/usr/games/doom\n
"},{"location":"applications/doom/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"chocolate-doom.chocolate-doom\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file doom.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n \"icon\": \"doom.svg\",\n \"keyword\": \"doom\",\n \"launch\": \"chocolate-doom.chocolate-doom\",\n \"name\": \"doom\",\n \"displayname\": \"Doom\",\n \"path\": \"/usr/games/doom\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
"},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application doom
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
"},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
"},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
"},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/draw/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/draw/#arguments","title":"Arguments","text":"\"--draw\"
Draw\n
"},{"location":"applications/draw/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/draw/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
"},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"\"odp;otg\"
\"odp;otg\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-draw\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-draw.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"json source file draw.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_draw.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-draw\",\n \"name\": \"draw\",\n \"displayname\": \"Draw\",\n \"showinview\": \"dock\",\n \"args\": \"--draw\",\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n \"fileextensions\": \"odp;otg\",\n \"legacyfileextensions\": \"odp;otg\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
"},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application draw
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
"},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
"},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
"},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/drawio/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
"},{"location":"applications/drawio/#displayname","title":"Displayname","text":"draw.io\n
"},{"location":"applications/drawio/#path","title":"Path","text":"/opt/drawio/drawio\n
"},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"application/vnd.jgraph.mxfile;application/vnd.visio;\n
"},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"\"drawio\"
\"drawio\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"draw.io.draw.io\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/drawio.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"json source file drawio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n \"icon\": \"circle_drawio.svg\",\n \"launch\": \"draw.io.draw.io\",\n \"name\": \"drawio\",\n \"displayname\": \"draw.io\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/opt/drawio/drawio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n \"fileextensions\": \"drawio\",\n \"legacyfileextensions\": \"drawio\",\n \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n \"postruncommands\": [\n \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n ]\n}\n
"},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
"},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application drawio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
"},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
"},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
"},{"location":"applications/dummy/","title":"Dummy","text":"dummy
"},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.eclipse
"},{"location":"applications/eclipse/#display-name","title":"Display name","text":"\"Eclipse\"
"},{"location":"applications/eclipse/#path","title":"path","text":"\"/usr/bin/eclipse\"
"},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.sts4
"},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"\"Eclipse Sts4\"
"},{"location":"applications/eclipse_sts4/#path","title":"path","text":"\"/opt/sts/SpringToolSuite4\"
"},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/edge/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"microsoft-edge-stable\n
"},{"location":"applications/edge/#displayname","title":"Displayname","text":"Microsoft Edge\n
"},{"location":"applications/edge/#path","title":"Path","text":"/usr/bin/microsoft-edge-stable\n
"},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
"},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"microsoft-edge.Microsoft-edge\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/microsoft-edge.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
"},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"json source file edge.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"microsoft-edge-stable\",\n \"preruncommands\": [\n \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n ],\n \"icon\": \"circle_microsoft-edge.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"microsoft-edge.Microsoft-edge\",\n \"name\": \"edge\",\n \"displayname\": \"Microsoft Edge\",\n \"path\": \"/usr/bin/microsoft-edge-stable\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
"},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application edge
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
"},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
"},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
"},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.elementary
"},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"io.elementary.terminal io.elementary.stylesheet\n
"},{"location":"applications/elementary.terminal/#path","title":"Path","text":"/usr/bin/io.elementary.terminal\n
"},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"io.elementary.terminal.Io.elementary.terminal\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/io.elementary.terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"terminal,bash,shell,cmd\",\n \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n \"name\": \"elementary.terminal\",\n \"path\": \"/usr/bin/io.elementary.terminal\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application elementary.terminal
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
"},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
"},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/eog/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"eog\n
"},{"location":"applications/eog/#path","title":"Path","text":"/usr/bin/eog\n
"},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
"},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"
\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"eog.Eog\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.eog.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"json source file eog.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"eog\",\n \"icon\": \"circle_eog.svg\",\n \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"eog.Eog\",\n \"name\": \"eog\",\n \"path\": \"/usr/bin/eog\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n \"usedefaultapplication\": true,\n \"quick\": true\n}\n
"},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
"},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application eog
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
"},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
"},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
"},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/evince/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"evince\n
"},{"location":"applications/evince/#path","title":"Path","text":"/usr/bin/evince\n
"},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
"},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"
\"pdf;ps;dvi\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"evince.Evince\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Evince.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"json source file evince.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"evince\",\n \"icon\": \"circle_acroread.svg\",\n \"keyword\": \"evince,pdf,viewer\",\n \"launch\": \"evince.Evince\",\n \"name\": \"Evince\",\n \"path\": \"/usr/bin/evince\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n \"legacyfileextensions\": \"pdf;ps;dvi\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
"},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Evince
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
"},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
"},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
"},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/evolution/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"evolution dbus-x11\n
"},{"location":"applications/evolution/#displayname","title":"Displayname","text":"Evolution\n
"},{"location":"applications/evolution/#path","title":"Path","text":"/usr/bin/evolution\n
"},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
"},{"location":"applications/evolution/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"evolution.Evolution\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Evolution.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"json source file evolution.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"evolution dbus-x11\",\n \"icon\": \"evolution.svg\",\n \"keyword\": \"evolution,mail\",\n \"launch\": \"evolution.Evolution\",\n \"name\": \"evolution\",\n \"displayname\": \"Evolution\",\n \"path\": \"/usr/bin/evolution\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
"},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
"},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application evolution
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
"},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
"},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
"},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"file-roller\n
"},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"file-roller\n
"},{"location":"applications/file-roller/#path","title":"Path","text":"/usr/bin/file-roller\n
"},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
"},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"file-roller.File-roller\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.FileRoller.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"json source file file-roller.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"file-roller\",\n \"icon\": \"circle_file-roller.svg\",\n \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n \"launch\": \"file-roller.File-roller\",\n \"name\": \"file-roller\",\n \"displayname\": \"file-roller\",\n \"path\": \"/usr/bin/file-roller\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
"},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application file-roller
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
"},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
"},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
"},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/filelight/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"filelight\n
"},{"location":"applications/filelight/#displayname","title":"Displayname","text":"Filelight\n
"},{"location":"applications/filelight/#path","title":"Path","text":"/usr/bin/filelight\n
"},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"inode/directory;\n
"},{"location":"applications/filelight/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"filelight.filelight\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.filelight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"json source file filelight.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"filelight\",\n \"icon\": \"filelight.svg\",\n \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n \"launch\": \"filelight.filelight\",\n \"name\": \"filelight\",\n \"displayname\": \"Filelight\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/filelight\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"inode/directory;\",\n \"fileextensions\": \"\",\n \"args\": \"\",\n \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
"},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
"},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application filelight
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
"},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
"},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
"},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"filezilla\n
"},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"filezilla (alpine)\n
"},{"location":"applications/filezilla/#path","title":"Path","text":"/usr/bin/filezilla\n
"},{"location":"applications/filezilla/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"filezilla.Filezilla\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/filezilla.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"json source file filezilla.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"filezilla\",\n \"icon\": \"circle_filezilla.svg\",\n \"keyword\": \"ftp,client\",\n \"launch\": \"filezilla.Filezilla\",\n \"name\": \"filezilla\",\n \"displayname\": \"filezilla (alpine)\",\n \"path\": \"/usr/bin/filezilla\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
"},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
"},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application filezilla
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
"},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
"},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
"},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"firefox-esr\n
"},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"Firefox (esr alpine)\n
"},{"location":"applications/firefox-esr/#path","title":"Path","text":"/usr/bin/firefox-esr\n
"},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"\"htm;html;xml;gif\"
\"htm;html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"Navigator.firefox-esr\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox-esr.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"json source file firefox-esr.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"cat\": \"office\",\n \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n ],\n \"apkpackage\": \"firefox-esr\",\n \"icon\": \"circle_firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.firefox-esr\",\n \"name\": \"firefox-esr\",\n \"displayname\": \"Firefox (esr alpine)\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/firefox-esr\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
"},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application firefox-esr
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
"},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
"},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
"},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/firefox/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"firefox krb5\n
"},{"location":"applications/firefox/#displayname","title":"Displayname","text":"Firefox (alpine)\n
"},{"location":"applications/firefox/#path","title":"Path","text":"/usr/bin/firefox\n
"},{"location":"applications/firefox/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"\"htm;html;xml;gif\"
\"htm;html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"Navigator.firefox\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"json source file firefox.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"cat\": \"office\",\n \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n \"postruncommands\": [\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n ],\n \"apkpackage\": \"firefox krb5\",\n \"icon\": \"circle_firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.firefox\",\n \"args\": \"\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox (alpine)\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
"},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Firefox
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
"},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
"},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
"},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.firefox.rest
"},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"firefox winbind
"},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"\"--class=Rest.Firefox\"
"},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"\"Firefox-Rest\"
"},{"location":"applications/firefoxrest/#path","title":"path","text":"\"/usr/bin/firefox\"
"},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"
"},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
"},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"\"html;xml\"
"},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
"},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/flare/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"flare-game\n
"},{"location":"applications/flare/#arguments","title":"Arguments","text":"\"--game=flare-game\"
/usr/games/flare\n
"},{"location":"applications/flare/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"flare.flare\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/flare.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"json source file flare.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"flare-game\",\n \"icon\": \"flare.svg\",\n \"keyword\": \"flare-game,role,playing\",\n \"launch\": \"flare.flare\",\n \"name\": \"flare\",\n \"args\": \"--game=flare-game\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/games/flare\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
"},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
"},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application flare
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
"},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
"},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
"},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"frozen-bubble\n
"},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"frozen-bubble\n
"},{"location":"applications/frozen-bubble/#path","title":"Path","text":"/usr/games/frozen-bubble\n
"},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"perl.perl\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file frozen-bubble.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"frozen-bubble\",\n \"icon\": \"frozen-bubble.svg\",\n \"keyword\": \"frozen,bubble\",\n \"launch\": \"perl.perl\",\n \"name\": \"frozen-bubble\",\n \"displayname\": \"frozen-bubble\",\n \"path\": \"/usr/games/frozen-bubble\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
"},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application frozen-bubble
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
"},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
"},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
"},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
"},{"location":"applications/gcompris/#path","title":"Path","text":"/usr/games/gcompris-qt\n
"},{"location":"applications/gcompris/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"gcompris-qt.gcompris-qt\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file gcompris.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n \"icon\": \"gcompris.svg\",\n \"installrecommends\": true,\n \"keyword\": \"gcompris\",\n \"launch\": \"gcompris-qt.gcompris-qt\",\n \"name\": \"GCompris\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/games/gcompris-qt\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
"},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
"},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application GCompris
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
"},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
"},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
"},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/geany/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
"},{"location":"applications/geany/#displayname","title":"Displayname","text":"Geany\n
"},{"location":"applications/geany/#path","title":"Path","text":"/usr/bin/geany\n
"},{"location":"applications/geany/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
"},{"location":"applications/geany/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"geany.Geany\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/geany.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"json source file geany.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"geany.svg\",\n \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n \"keyword\": \"text,editor,geany,ide\",\n \"launch\": \"geany.Geany\",\n \"name\": \"geany\",\n \"displayname\": \"Geany\",\n \"path\": \"/usr/bin/geany\",\n \"showinview\": \"dock\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
"},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
"},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application geany
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
"},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
"},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
"},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/gedit/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"gedit\n
"},{"location":"applications/gedit/#path","title":"Path","text":"/usr/bin/gedit\n
"},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"text/plain;\n
"},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"\"txt\"
\"txt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"gedit.Gedit\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gedit.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"json source file gedit.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gedit\",\n \"icon\": \"gedit.svg\",\n \"keyword\": \"editor\",\n \"launch\": \"gedit.Gedit\",\n \"name\": \"Gedit\",\n \"path\": \"/usr/bin/gedit\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"text/plain;\",\n \"fileextensions\": \"txt\",\n \"legacyfileextensions\": \"txt\",\n \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
"},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gedit
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
"},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
"},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
"},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"gelemental\n
"},{"location":"applications/gelemental/#path","title":"Path","text":"/usr/bin/gelemental\n
"},{"location":"applications/gelemental/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"gelemental.Gelemental\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gelemental.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"json source file gelemental.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"gelemental\",\n \"icon\": \"gelemental.svg\",\n \"keyword\": \"gelemental\",\n \"launch\": \"gelemental.Gelemental\",\n \"name\": \"gElemental\",\n \"path\": \"/usr/bin/gelemental\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
"},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
"},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application gElemental
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
"},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
"},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
"},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"geogebra\n
"},{"location":"applications/geogebra/#path","title":"Path","text":"/usr/bin/geogebra\n
"},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"\"ggb;ggt\"
\"ggb;ggt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"geogebra-GeoGebra.geogebra-GeoGebra\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file geogebra.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"geogebra\",\n \"icon\": \"geogebra.svg\",\n \"installrecommends\": true,\n \"keyword\": \"geogebra,math\",\n \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n \"name\": \"Geogebra\",\n \"path\": \"/usr/bin/geogebra\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"fileextensions\": \"ggb;ggt\",\n \"legacyfileextensions\": \"ggb;ggt\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktop\": \"geogebra.desktop\"\n}\n
"},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
"},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Geogebra
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
"},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
"},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
"},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.gephi
"},{"location":"applications/gephi/#display-name","title":"Display name","text":"\"Gephi\"
"},{"location":"applications/gephi/#path","title":"path","text":"\"/opt/gephi-0.9.1/bin/gephi\"
"},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.gimagereader
"},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"\"OCR-gimagereader\"
"},{"location":"applications/gimagereader/#path","title":"path","text":"\"/usr/bin/gimagereader-gtk\"
"},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"\"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"
"},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"\"bmp;jpeg;png,tiff,tga\"
"},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/gimp/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"gimp gimp-lang\n
"},{"location":"applications/gimp/#path","title":"Path","text":"/usr/bin/gimp\n
"},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
"},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"\"dds\"
\"dds\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"gimp.Gimp\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gimp.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"json source file gimp.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"gimp gimp-lang\",\n \"icon\": \"circle_gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\": \"dds\",\n \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n \"usedefaultapplication\": false,\n \"quick\": true\n}\n
"},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
"},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gimp
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
"},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
"},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
"},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"gnumeric glpk\n
"},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"Gnumerix (alpine)\n
"},{"location":"applications/gnumeric/#path","title":"Path","text":"/usr/bin/gnumeric\n
"},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
"},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"\"gnm\"
\"gnm\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"gnumeric.Gnumeric\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnumeric.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"json source file gnumeric.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gnumeric glpk\",\n \"icon\": \"gnumeric.svg\",\n \"keyword\": \"numeric\",\n \"launch\": \"gnumeric.Gnumeric\",\n \"displayname\": \"Gnumerix (alpine)\",\n \"name\": \"Gnumeric\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnumeric\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n \"fileextensions\": \"gnm\",\n \"legacyfileextensions\": \"gnm\",\n \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
"},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gnumeric
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
"},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
"},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
"},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/golly/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"golly\n
"},{"location":"applications/golly/#path","title":"Path","text":"/usr/games/golly\n
"},{"location":"applications/golly/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"golly.Golly\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file golly.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"golly\",\n \"icon\": \"golly.svg\",\n \"keyword\": \"golly\",\n \"launch\": \"golly.Golly\",\n \"name\": \"Golly\",\n \"path\": \"/usr/games/golly\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
"},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
"},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Golly
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
"},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
"},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
"},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/gretl/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"gretl\n
"},{"location":"applications/gretl/#path","title":"Path","text":"/usr/bin/gretl\n
"},{"location":"applications/gretl/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"gretl_x11.Gretl_x11\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"gretl\",\n \"icon\": \"gretl.svg\",\n \"keyword\": \"gretl\",\n \"launch\": \"gretl_x11.Gretl_x11\",\n \"name\": \"Gretl\",\n \"path\": \"/usr/bin/gretl\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gretl
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
"},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
"},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/hyper/#path","title":"Path","text":"/opt/Hyper/hyper\n
"},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"x-scheme-handler/ssh\n
"},{"location":"applications/hyper/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"hyper.Hyper\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/hyper.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
"},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"json source file hyper.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n \"RUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n ],\n \"icon\": \"hyper.svg\",\n \"keyword\": \"terminal,remote\",\n \"launch\": \"hyper.Hyper\",\n \"name\": \"hyper\",\n \"path\": \"/opt/Hyper/hyper\",\n \"mimetype\": \"x-scheme-handler/ssh\",\n \"fileextensions\": \"\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
"},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
"},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application hyper
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
"},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
"},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
"},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/impress/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/impress/#arguments","title":"Arguments","text":"\"--impress\"
Impress\n
"},{"location":"applications/impress/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/impress/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
"},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"
\"odp\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-impress\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-impress.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"json source file impress.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_impress.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-impress\",\n \"name\": \"impress\",\n \"displayname\": \"Impress\",\n \"showinview\": \"dock\",\n \"args\": \"--impress\",\n \"uniquerunkey\": \"libreoffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n \"legacyfileextensions\": \"odp\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
"},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application impress
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
"},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
"},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
"},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"inkscape inkscape-lang\n
"},{"location":"applications/inkscape/#path","title":"Path","text":"/usr/bin/inkscape\n
"},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
"},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"\"ai;cdr\"
\"ai;cdr\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"org.inkscape.Inkscape.Inkscape\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.inkscape.Inkscape.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"json source file inkscape.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"debpackage\": \"inkscape inkscape-lang\",\n \"icon\": \"circle_inkscape.svg\",\n \"keyword\": \"inkscape\",\n \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n \"name\": \"inkscape\",\n \"path\": \"/usr/bin/inkscape\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n \"fileextensions\": \"ai;cdr\",\n \"legacyfileextensions\": \"ai;cdr\",\n \"installrecommends\": true,\n \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
"},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
"},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application inkscape
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
"},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
"},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
"},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/jupyter/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.jupyter\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"json source file jupyter.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN add-apt-repository ppa:mozillateam/ppa\",\n \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n \"RUN pip3 install torch\",\n \"RUN pip3 install jupyterlab\",\n \"RUN pip install jupyterlab-nvdashboard\",\n \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n ],\n \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"jupyter.svg\",\n \"keyword\": \"jupyter\",\n \"launch\": \"gnome-terminal-server.jupyter\",\n \"name\": \"jupyter\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n ]\n}\n
"},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
"},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application jupyter
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
"},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
"},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
"},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"
jupyter nvidia\n
"},{"location":"applications/jupyternvidia/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.jupyternvidia\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"json source file jupyternvidia.d.3.0.json
{\n \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN add-apt-repository ppa:mozillateam/ppa\",\n \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n \"RUN pip3 install torch\",\n \"RUN pip3 install tensorflow-gpu\",\n \"RUN pip3 install jupyter notebook\",\n \"RUN pip3 install jupyterlab\",\n \"RUN pip3 install jupyterlab-nvdashboard\",\n \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n ],\n \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"jupyter.svg\",\n \"keyword\": \"jupyter\",\n \"launch\": \"gnome-terminal-server.jupyternvidia\",\n \"name\": \"jupyternvidia\",\n \"displayname\": \"jupyter nvidia\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n ]\n}\n
"},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
"},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application jupyternvidia
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
"},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
"},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
"},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"kalzium\n
"},{"location":"applications/kalzium/#path","title":"Path","text":"/usr/bin/kalzium\n
"},{"location":"applications/kalzium/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"kalzium.kalzium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kalzium.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"json source file kalzium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kalzium\",\n \"icon\": \"kalzium.svg\",\n \"keyword\": \"kalzium\",\n \"launch\": \"kalzium.kalzium\",\n \"name\": \"Kalzium\",\n \"path\": \"/usr/bin/kalzium\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
"},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Kalzium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
"},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
"},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
"},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"kdiamond\n
"},{"location":"applications/kdiamond/#path","title":"Path","text":"/usr/games/kdiamond\n
"},{"location":"applications/kdiamond/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"kdiamond.kdiamond\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file kdiamond.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"kdiamond\",\n \"icon\": \"kdiamond.svg\",\n \"keyword\": \"kdiamond\",\n \"launch\": \"kdiamond.kdiamond\",\n \"name\": \"kDiamond\",\n \"path\": \"/usr/games/kdiamond\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
"},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kDiamond
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
"},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
"},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
"},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"kgeography\n
"},{"location":"applications/kgeography/#path","title":"Path","text":"/usr/bin/kgeography\n
"},{"location":"applications/kgeography/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"kgeography.kgeography\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kgeography.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"json source file kgeography.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kgeography\",\n \"icon\": \"kgeography.svg\",\n \"keyword\": \"kgeography,geography\",\n \"launch\": \"kgeography.kgeography\",\n \"name\": \"Kgeography\",\n \"path\": \"/usr/bin/kgeography\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
"},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Kgeography
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
"},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
"},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
"},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/kigo/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11 dbus-user-session gnugo kigo\n
"},{"location":"applications/kigo/#displayname","title":"Displayname","text":"kigo\n
"},{"location":"applications/kigo/#path","title":"Path","text":"/usr/games/kigo\n
"},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"application/x-go-sgf;\n
"},{"location":"applications/kigo/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"kigo.kigo\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kigo.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
"},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"json source file kigo.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"args\": \"\",\n \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n \"icon\": \"kigo.svg\",\n \"keyword\": \"go,kigo,gnugo\",\n \"launch\": \"kigo.kigo\",\n \"name\": \"kigo\",\n \"mimetype\": \"application/x-go-sgf;\",\n \"displayname\": \"kigo\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"path\": \"/usr/games/kigo\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n ]\n}\n
"},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
"},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kigo
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
"},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
"},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
"},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/klickety/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"breeze-icon-theme dbus-x11 dbus-user-session klickety\n
"},{"location":"applications/klickety/#path","title":"Path","text":"/usr/games/klickety\n
"},{"location":"applications/klickety/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"klickety.klickety\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file klickety.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n \"icon\": \"klickety.svg\",\n \"keyword\": \"klickety\",\n \"launch\": \"klickety.klickety\",\n \"name\": \"Klickety\",\n \"path\": \"/usr/games/klickety\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
"},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Klickety
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
"},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
"},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
"},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/klotski/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-klotski\n
"},{"location":"applications/klotski/#path","title":"Path","text":"/usr/games/gnome-klotski\n
"},{"location":"applications/klotski/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"gnome-klotski.Gnome-klotski\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-klotski.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"json source file klotski.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-klotski\",\n \"icon\": \"circle_gnome-klotski.svg\",\n \"keyword\": \"gnome klotski,game klotski,klotski\",\n \"launch\": \"gnome-klotski.Gnome-klotski\",\n \"name\": \"klotski\",\n \"host_config\": {\n \"mem_limit\": \"384M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/games/gnome-klotski\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
"},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
"},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application klotski
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
"},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
"},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
"},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/konsole/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"konsole, sudo\n
"},{"location":"applications/konsole/#path","title":"Path","text":"/usr/bin/konsole\n
"},{"location":"applications/konsole/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"konsole.konsole\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"json source file konsole.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"icon\": \"konsole.svg\",\n \"apkpackage\": \"konsole, sudo\",\n \"keyword\": \"ksonsole,console,shell,bash,sh\",\n \"launch\": \"konsole.konsole\",\n \"name\": \"konsole\",\n \"path\": \"/usr/bin/konsole\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"quick\": true\n}\n
"},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
"},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application konsole
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
"},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
"},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
"},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu
"},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11 dbus-user-session ksquares\n
"},{"location":"applications/ksquares/#path","title":"Path","text":"/usr/games/ksquares\n
"},{"location":"applications/ksquares/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"ksquares.ksquares\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file ksquares.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n \"icon\": \"ksquares.svg\",\n \"keyword\": \"ksquares\",\n \"launch\": \"ksquares.ksquares\",\n \"name\": \"kSquares\",\n \"path\": \"/usr/games/ksquares\",\n \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
"},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
"},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kSquares
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
"},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
"},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
"},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"kturtle mesa-dri-gallium\n
"},{"location":"applications/kturtle/#path","title":"Path","text":"/usr/bin/kturtle\n
"},{"location":"applications/kturtle/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"kturtle.kturtle\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kturtle.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"json source file kturtle.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kturtle mesa-dri-gallium\",\n \"icon\": \"kturtle.svg\",\n \"keyword\": \"kturtle\",\n \"launch\": \"kturtle.kturtle\",\n \"name\": \"kTurtle\",\n \"path\": \"/usr/bin/kturtle\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
"},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
"},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kTurtle
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
"},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
"},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
"},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/leocad/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"leocad\n
"},{"location":"applications/leocad/#arguments","title":"Arguments","text":"\"-l /usr/bin/leocad.library.bin\"
/usr/bin/leocad\n
"},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
"},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"\"lcd\"
\"lcd\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"leocad.Leocad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file leocad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"-l /usr/bin/leocad.library.bin\",\n \"cat\": \"games\",\n \"debpackage\": \"leocad\",\n \"icon\": \"leocad.svg\",\n \"keyword\": \"cad,lego\",\n \"launch\": \"leocad.Leocad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"Leocad\",\n \"path\": \"/usr/bin/leocad\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n \"fileextensions\": \"lcd\",\n \"legacyfileextensions\": \"lcd\"\n}\n
"},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
"},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Leocad
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
"},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
"},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
"},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/librecad/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"librecad\n
"},{"location":"applications/librecad/#path","title":"Path","text":"/usr/bin/librecad\n
"},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"image/vnd.dxf;\n
"},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"\"dxf;dwg\"
\"dxf;dwg\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"librecad.Librecad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file librecad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"librecad\",\n \"icon\": \"librecad.svg\",\n \"keyword\": \"librecad,modeling\",\n \"launch\": \"librecad.Librecad\",\n \"name\": \"LibreCAD\",\n \"path\": \"/usr/bin/librecad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"image/vnd.dxf;\",\n \"fileextensions\": \"dxf;dwg\",\n \"legacyfileextensions\": \"dxf;dwg\"\n}\n
"},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
"},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application LibreCAD
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
"},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
"},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
"},{"location":"applications/list/","title":"Application list","text":"This array describe the application list ready to use with abcdesktop.
icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-mahjongg\n
"},{"location":"applications/mahjongg/#path","title":"Path","text":"/usr/games/gnome-mahjongg\n
"},{"location":"applications/mahjongg/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"gnome-mahjongg.Gnome-mahjongg\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-mahjongg.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"json source file mahjongg.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-mahjongg\",\n \"icon\": \"circle_gnome-mahjongg.svg\",\n \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n \"name\": \"mahjongg\",\n \"path\": \"/usr/games/gnome-mahjongg\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
"},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
"},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application mahjongg
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
"},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
"},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
"},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/maps/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"gnome-maps\n
"},{"location":"applications/maps/#path","title":"Path","text":"/usr/bin/gnome-maps\n
"},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
"},{"location":"applications/maps/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"org.gnome.Maps.org.gnome.Maps\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Maps.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"json source file maps.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"apkpackage\": \"gnome-maps\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"icon\": \"org.gnome.Maps.svg\",\n \"keyword\": \"maps\",\n \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n \"name\": \"maps\",\n \"path\": \"/usr/bin/gnome-maps\",\n \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
"},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
"},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application maps
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
"},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
"},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
"},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/math/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/math/#arguments","title":"Arguments","text":"\"--math\"
Math\n
"},{"location":"applications/math/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/math/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
"},{"location":"applications/math/#file-extensions","title":"File extensions","text":"\"odf;odc\"
\"odf;odc\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-math\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-math.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/math/#json-dump","title":"JSON dump","text":"json source file math.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_math.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-math\",\n \"name\": \"math\",\n \"displayname\": \"Math\",\n \"args\": \"--math\",\n \"uniquerunkey\": \"libreoffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n \"fileextensions\": \"odf;odc\",\n \"legacyfileextensions\": \"odf;odc\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
"},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application math
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
"},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f math.d -t math .\n
"},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
"},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"ubuntu
"},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"mathwar\n
"},{"location":"applications/mathwar/#path","title":"Path","text":"/usr/games/mathwar\n
"},{"location":"applications/mathwar/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"mathwar.Mathwar\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file mathwar.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"mathwar\",\n \"icon\": \"mathwar.svg\",\n \"keyword\": \"mathwar,math\",\n \"launch\": \"mathwar.Mathwar\",\n \"name\": \"Mathwar\",\n \"path\": \"/usr/games/mathwar\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
"},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Mathwar
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
"},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
"},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
"},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/minecraft/#path","title":"Path","text":"/usr/bin/minecraft-launcher\n
"},{"location":"applications/minecraft/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"minecraft-launcher.Minecraft Launcher\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/minecraft-launcher.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
"},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"json source file minecraft.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"\",\n \"icon\": \"circle_minecraft.svg\",\n \"keyword\": \"minecraft\",\n \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n \"name\": \"minecraft\",\n \"path\": \"/usr/bin/minecraft-launcher\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktop\": \"minecraft-launcher.desktop\",\n \"host_config\": {\n \"mem_limit\": \"4G\",\n \"shm_size\": \"2G\",\n \"cpu_period\": 200000,\n \"cpu_quota\": 200000,\n \"ipc_mode\": \"shareable\"\n },\n \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n ]\n}\n
"},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
"},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application minecraft
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
"},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
"},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
"},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/mines/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"gnome-mines\n
"},{"location":"applications/mines/#displayname","title":"Displayname","text":"gnome-mines (alpine)\n
"},{"location":"applications/mines/#path","title":"Path","text":"/usr/bin/gnome-mines\n
"},{"location":"applications/mines/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"gnome-mines.Gnome-mines\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Mines.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"json source file mines.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"displayname\": \"gnome-mines (alpine)\",\n \"apkpackage\": \"gnome-mines\",\n \"icon\": \"circle_gnome-mines.svg\",\n \"keyword\": \"gnome mines,game mines,mines\",\n \"launch\": \"gnome-mines.Gnome-mines\",\n \"name\": \"Mines\",\n \"path\": \"/usr/bin/gnome-mines\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
"},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
"},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Mines
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
"},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
"},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
"},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
"},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"FileManager\n
"},{"location":"applications/nautilus/#path","title":"Path","text":"/usr/bin/nautilus\n
"},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/nautilus/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"org.gnome.Nautilus.Org.gnome.Nautilus\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Nautilus.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
"},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"json source file nautilus.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"preruncommands\": [\n \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n \"COPY composer/node /composer/node\",\n \"RUN cd /composer/node/ocdownload && npm install\",\n \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n ],\n \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n \"icon\": \"circle_filemanager.svg\",\n \"keyword\": \"file,manager,nautilus\",\n \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n \"name\": \"nautilus\",\n \"displayname\": \"FileManager\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/nautilus\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n \"usedefaultapplication\": true,\n \"quick\": true\n}\n
"},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
"},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application nautilus
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
"},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
"},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
"},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"netbeans
"},{"location":"applications/netbeans/#display-name","title":"Display name","text":"\"Netbeans\"
"},{"location":"applications/netbeans/#path","title":"path","text":"\"/usr/bin/netbeans\"
"},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"Notepad Wine (alpine)\n
"},{"location":"applications/notepad-wine/#path","title":"Path","text":"/usr/bin/notepad\n
"},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"application/text;\n
"},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"\"txt;log;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"notepad.exe.notepad.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"json source file notepad-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"apkpackage\": \"wine\",\n \"icon\": \"notepad.svg\",\n \"keyword\": \"wine,notepad,text\",\n \"launch\": \"notepad.exe.notepad.exe\",\n \"name\": \"notepad-wine\",\n \"displayname\": \"Notepad Wine (alpine)\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\": \"txt;log;\",\n \"path\": \"/usr/bin/notepad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
"},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application notepad-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
"},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
"},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
"},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"notepadqq\n
"},{"location":"applications/notepadqq/#path","title":"Path","text":"/usr/bin/notepadqq\n
"},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
"},{"location":"applications/notepadqq/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"notepadqq-bin.Notepadqq\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/notepadqq.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"json source file notepadqq.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,development\",\n \"debpackage\": \"notepadqq\",\n \"icon\": \"notepadqq.svg\",\n \"keyword\": \"notepad,plus,editor\",\n \"launch\": \"notepadqq-bin.Notepadqq\",\n \"name\": \"notepadqq\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/bin/notepadqq\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
"},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
"},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application notepadqq
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
"},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
"},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
"},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/octave/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"octave\n
"},{"location":"applications/octave/#path","title":"Path","text":"/usr/bin/octave\n
"},{"location":"applications/octave/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"octave-gui.octave-gui\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/www.octave.org-octave.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"json source file octave.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"octave\",\n \"icon\": \"Gnu-octave-logo.svg\",\n \"keyword\": \"octave\",\n \"launch\": \"octave-gui.octave-gui\",\n \"name\": \"octave\",\n \"path\": \"/usr/bin/octave\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
"},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
"},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application octave
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
"},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
"},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
"},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"onlyoffice-desktopeditors\n
"},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"OnlyOffice\n
"},{"location":"applications/onlyoffice/#path","title":"Path","text":"/usr/bin/desktopeditors\n
"},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
"},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"DesktopEditors.DesktopEditors\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/onlyoffice-desktopeditors.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"json source file onlyoffice.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"onlyoffice-desktopeditors\",\n \"icon\": \"onlyoffice-desktopeditors.svg\",\n \"installrecommends\": true,\n \"keyword\": \"office,onlyoffice,desktop,editor\",\n \"launch\": \"DesktopEditors.DesktopEditors\",\n \"name\": \"onlyoffice\",\n \"displayname\": \"OnlyOffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/desktopeditors\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n \"args\": \"\",\n \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n \"licence\": \"non-free\"\n}\n
"},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
"},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application onlyoffice
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
"},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
"},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
"},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/openshift/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"rhc gnome-terminal\n
"},{"location":"applications/openshift/#arguments","title":"Arguments","text":"\"--disable-factory --class openshift.cli\"
OpenShift cli\n
"},{"location":"applications/openshift/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/openshift/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.openshift.cli\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
"},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n ],\n \"debpackage\": \"rhc gnome-terminal\",\n \"icon\": \"openshift.svg\",\n \"keyword\": \"oc,openshift\",\n \"launch\": \"gnome-terminal-server.openshift.cli\",\n \"name\": \"openshift\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"displayname\": \"OpenShift cli\",\n \"args\": \"--disable-factory --class openshift.cli\",\n \"quick\": true\n}\n
"},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application openshift
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
"},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
"},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/pinta/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
"},{"location":"applications/pinta/#displayname","title":"Displayname","text":"Pinta (alpine)\n
"},{"location":"applications/pinta/#path","title":"Path","text":"/usr/bin/pinta\n
"},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
"},{"location":"applications/pinta/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"Pinta.Pinta\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/pinta.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"json source file pinta.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"displayname\": \"Pinta (alpine)\",\n \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n \"icon\": \"pinta.svg\",\n \"keyword\": \"pinta,paint\",\n \"launch\": \"Pinta.Pinta\",\n \"name\": \"Pinta\",\n \"path\": \"/usr/bin/pinta\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
"},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
"},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Pinta
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
"},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
"},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
"},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/planner/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"planner\n
"},{"location":"applications/planner/#path","title":"Path","text":"/usr/bin/planner\n
"},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"application/x-planner;\n
"},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"\"mpp;mpx\"
\"mpp;mpx\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"planner.Planner\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file planner.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"planner\",\n \"icon\": \"planner.svg\",\n \"launch\": \"planner.Planner\",\n \"name\": \"Planner\",\n \"path\": \"/usr/bin/planner\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"application/x-planner;\",\n \"fileextensions\": \"mpp;mpx\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"legacyfileextensions\": \"mpp;mpx\"\n}\n
"},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
"},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Planner
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
"},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
"},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
"},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/postman/#displayname","title":"Displayname","text":"Postman\n
"},{"location":"applications/postman/#path","title":"Path","text":"/usr/local/bin/Postman/app/Postman\n
"},{"location":"applications/postman/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"postman.Postman\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
"},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"json source file postman.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n ],\n \"cat\": \"development\",\n \"debpackage\": \"\",\n \"installrecommends\": false,\n \"icon\": \"circle_postman.svg\",\n \"keyword\": \"http,post,json\",\n \"launch\": \"postman.Postman\",\n \"displayname\": \"Postman\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"postman\",\n \"path\": \"/usr/local/bin/Postman/app/Postman\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
"},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
"},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application postman
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
"},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
"},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
"},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/powershell/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
"},{"location":"applications/powershell/#arguments","title":"Arguments","text":"\"--class=powershell -- /usr/bin/pwsh\"
Powershell\n
"},{"location":"applications/powershell/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"application/hlp;\n
"},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"\"hlp;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.powershell\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file powershell.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n \"icon\": \"powershell.svg\",\n \"keyword\": \"powershell\",\n \"launch\": \"gnome-terminal-server.powershell\",\n \"name\": \"powershell\",\n \"displayname\": \"Powershell\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"application/hlp;\",\n \"fileextensions\": \"hlp;\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
"},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application powershell
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
"},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
"},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
"},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"putty\n
"},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"Putty Unix\n
"},{"location":"applications/putty-unix/#path","title":"Path","text":"/usr/bin/putty\n
"},{"location":"applications/putty-unix/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"putty.Putty\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file putty-unix.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"\",\n \"cat\": \"utilities\",\n \"apkpackage\": \"putty\",\n \"icon\": \"circle_putty-unix.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.Putty\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"putty-unix\",\n \"displayname\": \"Putty Unix\",\n \"path\": \"/usr/bin/putty\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
"},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application putty-unix
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
"},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
"},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
"},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"\"/composer/bin/putty.exe\"
Putty Wine (alpine)\n
"},{"location":"applications/putty-wine/#path","title":"Path","text":"/usr/bin/wine64\n
"},{"location":"applications/putty-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"putty.exe.putty.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
"},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"json source file putty-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"RUN mkdir -p /composer/bin\",\n \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"wine,putty,ssh,terminal\",\n \"launch\": \"putty.exe.putty.exe\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine (alpine)\",\n \"path\": \"/usr/bin/wine64\"\n}\n
"},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
"},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application putty-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
"},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
"},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
"},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"ubuntu
"},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"qelectrotech\n
"},{"location":"applications/qelectrotech/#path","title":"Path","text":"/usr/bin/qelectrotech\n
"},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"qelectrotech.Qelectrotech\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file qelectrotech.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"qelectrotech\",\n \"icon\": \"qelectrotech.svg\",\n \"keyword\": \"qelectrotech\",\n \"launch\": \"qelectrotech.Qelectrotech\",\n \"name\": \"qElectrotech\",\n \"path\": \"/usr/bin/qelectrotech\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
"},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application qElectrotech
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
"},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
"},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
"},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"Remarkable\n
"},{"location":"applications/remarkable/#path","title":"Path","text":"/usr/bin/remarkable\n
"},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"text/x-markdown;text/markdown;\n
"},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"\"md;markdown\"
\"md;markdown\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"remarkable.Remarkable\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remarkable.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"json source file remarkable.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"remarkable.svg\",\n \"keyword\": \"markdown,editor\",\n \"launch\": \"remarkable.Remarkable\",\n \"name\": \"remarkable\",\n \"displayname\": \"Remarkable\",\n \"path\": \"/usr/bin/remarkable\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/x-markdown;text/markdown;\",\n \"legacyfileextensions\": \"md;markdown\",\n \"fileextensions\": \"md;markdown\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
"},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remarkable
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
"},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
"},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
"},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/remmina/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
"},{"location":"applications/remmina/#displayname","title":"Displayname","text":"Remmina\n
"},{"location":"applications/remmina/#path","title":"Path","text":"/usr/bin/remmina\n
"},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"application/x-remmina;\n
"},{"location":"applications/remmina/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"remmina.Remmina\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remmina-file.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"json source file remmina.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n \"icon\": \"remmina.svg\",\n \"keyword\": \"rdp,tsclient\",\n \"launch\": \"remmina.Remmina\",\n \"name\": \"remmina\",\n \"displayname\": \"Remmina\",\n \"args\": \"\",\n \"path\": \"/usr/bin/remmina\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/x-remmina;\",\n \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
"},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remmina
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
"},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
"},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
"},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
"},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"RemoteDesktop\n
"},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"/bin/remotedesktopmanager.free\n
"},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"RemoteDesktopManager.Free.RemoteDesktopManager.Free\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remotedesktopmanager.free.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
"},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"json source file remotedesktopmanager.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"licence\": \"non-free\",\n \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n \"icon\": \"circle-remotedesktopmanager.svg\",\n \"keyword\": \"remote,desktop,ssh\",\n \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n \"name\": \"remotedesktopmanager\",\n \"displayname\": \"RemoteDesktop\",\n \"path\": \"/bin/remotedesktopmanager.free\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"\",\n \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n ]\n}\n
"},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
"},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remotedesktopmanager
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
"},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
"},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
"},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"rhythmbox\n
"},{"location":"applications/rhythmbox/#path","title":"Path","text":"/usr/bin/rhythmbox\n
"},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
"},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"rhythmbox.Rhythmbox\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Rhythmbox3.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"json source file rhythmbox.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"rhythmbox\",\n \"icon\": \"circle_rhythmbox.svg\",\n \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n \"launch\": \"rhythmbox.Rhythmbox\",\n \"name\": \"rhythmbox\",\n \"path\": \"/usr/bin/rhythmbox\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
"},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
"},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application rhythmbox
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
"},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
"},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
"},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/robots/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-robots\n
"},{"location":"applications/robots/#path","title":"Path","text":"/usr/games/gnome-robots\n
"},{"location":"applications/robots/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"gnome-robots.Gnome-robots\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
gnome-robots.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"json source file robots.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-robots\",\n \"icon\": \"circle_gnome-robots.svg\",\n \"keyword\": \"gnome robots,game robots,robots\",\n \"launch\": \"gnome-robots.Gnome-robots\",\n \"name\": \"Robots\",\n \"path\": \"/usr/games/gnome-robots\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"gnome-robots.desktop\"\n}\n
"},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
"},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Robots
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
"},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
"},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
"},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"shotcut mesa-dri-gallium\n
"},{"location":"applications/shotcut/#path","title":"Path","text":"/usr/bin/shotcut\n
"},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
"},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"\"mlt\"
\"mlt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"shotcut.Shotcut\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.shotcut.Shotcut.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"json source file shotcut.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"shotcut mesa-dri-gallium\",\n \"icon\": \"circle_shotcut.svg\",\n \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n \"launch\": \"shotcut.Shotcut\",\n \"name\": \"Shotcut\",\n \"path\": \"/usr/bin/shotcut\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n \"fileextensions\": \"mlt\",\n \"legacyfileextensions\": \"mlt\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
"},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Shotcut
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
"},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
"},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
"},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"stellarium\n
"},{"location":"applications/stellarium/#path","title":"Path","text":"/usr/bin/stellarium\n
"},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"application/x-stellarium-script;\n
"},{"location":"applications/stellarium/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"stellarium.stellarium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.stellarium.Stellarium.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"json source file stellarium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"stellarium\",\n \"icon\": \"stellarium.svg\",\n \"keyword\": \"stellarium,astronomy\",\n \"launch\": \"stellarium.stellarium\",\n \"name\": \"Stellarium\",\n \"path\": \"/usr/bin/stellarium\",\n \"mimetype\": \"application/x-stellarium-script;\",\n \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
"},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Stellarium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
"},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
"},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
"},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/step/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"step\n
"},{"location":"applications/step/#path","title":"Path","text":"/usr/bin/step\n
"},{"location":"applications/step/#mimetype","title":"Mimetype","text":"application/x-step;\n
"},{"location":"applications/step/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"step.step\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.step.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/step/#json-dump","title":"JSON dump","text":"json source file step.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"step\",\n \"icon\": \"step.svg\",\n \"keyword\": \"step\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"launch\": \"step.step\",\n \"name\": \"Step\",\n \"path\": \"/usr/bin/step\",\n \"mimetype\": \"application/x-step;\",\n \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
"},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Step
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
"},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
"},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
"},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/stress/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"at-spi2-core gnome-terminal dbus-x11 stress\n
"},{"location":"applications/stress/#arguments","title":"Arguments","text":"\"--disable-factory --class=stress\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/stress/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.stress\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"json source file stress.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n \"icon\": \"stress.svg\",\n \"keyword\": \"stress,cpu,shell\",\n \"launch\": \"gnome-terminal-server.stress\",\n \"name\": \"stress\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=stress\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
"},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
"},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application stress
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
"},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
"},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
"},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"sublime-text\n
"},{"location":"applications/sublime-text/#path","title":"Path","text":"/opt/sublime_text/sublime_text\n
"},{"location":"applications/sublime-text/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"sublime_text.Sublime_text\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/sublime_text.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
"},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"json source file sublime-text.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n ],\n \"debpackage\": \"sublime-text\",\n \"installrecommends\": true,\n \"icon\": \"circle_sublime-text.svg\",\n \"keyword\": \"ide,code,sublime-text\",\n \"launch\": \"sublime_text.Sublime_text\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"sublime-Text\",\n \"path\": \"/opt/sublime_text/sublime_text\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
"},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
"},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application sublime-Text
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
"},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
"},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
"},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"gnome-sudoku\n
"},{"location":"applications/sudoku/#path","title":"Path","text":"/usr/bin/gnome-sudoku\n
"},{"location":"applications/sudoku/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"org.gnome.Sudoku.org.gnome.Sudoku\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Sudoku.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"json source file sudoku.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnome-sudoku\",\n \"icon\": \"org.gnome.Sudoku.svg\",\n \"keyword\": \"sudoku\",\n \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n \"name\": \"sudoku\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-sudoku\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
"},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
"},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application sudoku
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
"},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
"},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
"},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpinei.minimal
"},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"alpine
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"supertux mesa-gl mesa-egl mesa-dri-gallium\n
"},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"supertux2\n
"},{"location":"applications/supertux2/#path","title":"Path","text":"/usr/games/supertux2\n
"},{"location":"applications/supertux2/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"supertux2.supertux2\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/supertux2.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"json source file supertux2.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n \"icon\": \"circle_supertux.svg\",\n \"keyword\": \"supertux\",\n \"launch\": \"supertux2.supertux2\",\n \"name\": \"supertux2\",\n \"displayname\": \"supertux2\",\n \"path\": \"/usr/games/supertux2\",\n \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
"},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
"},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application supertux2
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
"},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
"},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
"},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"swell-foop\n
"},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"swell-foop\n
"},{"location":"applications/swell-foop/#path","title":"Path","text":"/usr/games/swell-foop\n
"},{"location":"applications/swell-foop/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"swell-foop.Swell-foop\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.SwellFoop.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"json source file swell-foop.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"swell-foop\",\n \"icon\": \"circle_swell-foop.svg\",\n \"keyword\": \"swell,foop\",\n \"launch\": \"swell-foop.Swell-foop\",\n \"name\": \"swell-foop\",\n \"displayname\": \"swell-foop\",\n \"path\": \"/usr/games/swell-foop\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
"},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
"},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application swell-foop
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
"},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
"},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
"},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/taquin/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"gnome-taquin\n
"},{"location":"applications/taquin/#path","title":"Path","text":"/usr/bin/gnome-taquin\n
"},{"location":"applications/taquin/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"org.gnome.Taquin.org.gnome.Weather\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Taquin.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"json source file taquin.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnome-taquin\",\n \"icon\": \"org.gnome.Taquin.svg\",\n \"keyword\": \"taquin\",\n \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n \"name\": \"taquin\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-taquin\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
"},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
"},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application taquin
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
"},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
"},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
"},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/teams/#arguments","title":"Arguments","text":"\"--disable-namespace-sandbox --disable-setuid-sandbox\"
Microsoft Teams\n
"},{"location":"applications/teams/#path","title":"Path","text":"/usr/bin/teams\n
"},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"x-scheme-handler/msteams;\n
"},{"location":"applications/teams/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"microsoft teams - preview.Microsoft Teams - Preview\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/teams.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"json source file teams.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"\",\n \"preruncommands\": [\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"icon\": \"teams.svg\",\n \"keyword\": \"teams\",\n \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n \"name\": \"teams\",\n \"displayname\": \"Microsoft Teams\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/teams\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"x-scheme-handler/msteams;\",\n \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
"},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application teams
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
"},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
"},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
"},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/terminal/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/terminal/#arguments","title":"Arguments","text":"\"--disable-factory\"
Terminal sudo\n
"},{"location":"applications/terminal/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminal/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/terminal/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.Gnome-terminal\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"json source file terminal.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n \"name\": \"Terminal\",\n \"displayname\": \"Terminal sudo\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
"},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Terminal
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
"},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
"},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
"},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.fulldev.ia
"},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"gnome-terminal dbus-x11
"},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"\"--disable-factory --class=terminalai\"
"},{"location":"applications/terminalai/#display-name","title":"Display name","text":"\"Shell AI\"
"},{"location":"applications/terminalai/#path","title":"path","text":"\"/usr/bin/gnome-terminal\"
"},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
"},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"\"--disable-factory --class=ephemeral\"
Terminal [ephemeral container]\n
"},{"location":"applications/terminalephemeral/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.ephemeral\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"json source file terminalephemeral.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"ephemeral,terminal,shell\",\n \"launch\": \"gnome-terminal-server.ephemeral\",\n \"name\": \"terminalephemeral\",\n \"displayname\": \"Terminal [ephemeral container]\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=ephemeral\",\n \"containerengine\": \"ephemeral_container\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
"},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application terminalephemeral
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
"},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
"},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
"},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
"},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"\"--disable-factory --class=pod\"
Terminal [Pod]\n
"},{"location":"applications/terminalpod/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalpod/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.pod\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"json source file terminalpod.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"pod,terminal,shell\",\n \"launch\": \"gnome-terminal-server.pod\",\n \"name\": \"terminalpod\",\n \"displayname\": \"Terminal [Pod]\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=pod\",\n \"containerengine\": \"pod_application\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
"},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application terminalpod
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
"},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
"},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
"},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-tetravex\n
"},{"location":"applications/tetravex/#path","title":"Path","text":"/usr/games/gnome-tetravex\n
"},{"location":"applications/tetravex/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"gnome-tetravex.Gnome-tetravex\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file tetravex.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-tetravex\",\n \"icon\": \"gnome-tetravex.svg\",\n \"keyword\": \"game\",\n \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n \"name\": \"Tetravex\",\n \"path\": \"/usr/games/gnome-tetravex\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktop\": \"gnome-tetravex.desktop\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"384M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n }\n}\n
"},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
"},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Tetravex
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
"},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
"},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
"},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"tk thunderbird gnome-keyring\n
"},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"Thunderbird\n
"},{"location":"applications/thunderbird/#path","title":"Path","text":"/usr/bin/thunderbird\n
"},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"x-scheme-handler/mailto\n
"},{"location":"applications/thunderbird/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"Mail.Thunderbird\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/thunderbird.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"json source file thunderbird.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"tk thunderbird gnome-keyring\",\n \"icon\": \"thunderbird.svg\",\n \"keyword\": \"mail\",\n \"launch\": \"Mail.Thunderbird\",\n \"name\": \"thunderbird\",\n \"displayname\": \"Thunderbird\",\n \"path\": \"/usr/bin/thunderbird\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"x-scheme-handler/mailto\",\n \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
"},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
"},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application thunderbird
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
"},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
"},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
"},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/vice/#displayname","title":"Displayname","text":"Commodore64\n
"},{"location":"applications/vice/#path","title":"Path","text":"/usr/bin/x64\n
"},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"\"crt;bin\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"x64.X64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/x64.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
"},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"json source file vice.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"c64.svg\",\n \"keyword\": \"x64,vice,commodore,c64\",\n \"launch\": \"x64.X64\",\n \"name\": \"vice\",\n \"displayname\": \"Commodore64\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/x64\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"fileextensions\": \"crt;bin\",\n \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
"},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vice
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
"},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
"},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
"},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/vlc/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
"},{"location":"applications/vlc/#displayname","title":"Displayname","text":"videolan\n
"},{"location":"applications/vlc/#path","title":"Path","text":"/usr/bin/vlc\n
"},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
"},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"vlc.vlc\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/vlc.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"json source file vlc.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office,graphics\",\n \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n \"icon\": \"circle_vlc.svg\",\n \"keyword\": \"vlc, videolan, video, lan, dvd\",\n \"launch\": \"vlc.vlc\",\n \"name\": \"vlc\",\n \"displayname\": \"videolan\",\n \"path\": \"/usr/bin/vlc\",\n \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
"},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vlc
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
"},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
"},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
"},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"abcdesktop/docker-osx
"},{"location":"applications/vmmacos/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"qemu.Qemu-system-x86_64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN yes | sudo pacman -S xorg-xauth\n
"},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"json source file vmmacos.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"RUN yes | sudo pacman -S xorg-xauth\"\n ],\n \"icon\": \"MacOS_logo.svg\",\n \"keyword\": \"macos,apple\",\n \"launch\": \"qemu.Qemu-system-x86_64\",\n \"name\": \"vmmacos\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"devices\": [\n \"/dev/kvm\"\n ],\n \"mem_limit\": \"16G\"\n },\n \"template\": \"abcdesktop/docker-osx\",\n \"workdir\": \"/home/arch/OSX-KVM\",\n \"user\": \"arch\",\n \"home\": \"/home/arch\",\n \"cmd\": [\n \"/bin/bash\",\n \"-c\",\n \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true ; [[ \\\"${NOPICKER}\\\" == true ]] && { sed -i '/^.*InstallMedia.*/d' Launch.sh && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\" ; } || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && { ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --count 1 --tsv ./serial.tsv --bootdisks --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\" --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" --output-env \\\"${ENV:=/env}\\\" || exit 1 ; } ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && { source \\\"${ENV:=/env}\\\" 2>/dev/null ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\" --serial \\\"${SERIAL}\\\" --board-serial \\\"${BOARD_SERIAL}\\\" --uuid \\\"${UUID}\\\" --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\" --height \\\"${HEIGHT:-1080}\\\" --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ; ./Launch.sh\"\n ]\n}\n
"},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
"},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true ; [[ \"${NOPICKER}\" == true ]] && { sed -i '/^.*InstallMedia.*/d' Launch.sh && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\" ; } || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" ; [[ \"${GENERATE_UNIQUE}\" == true ]] && { ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --count 1 --tsv ./serial.tsv --bootdisks --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\" --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" --output-env \"${ENV:=/env}\" || exit 1 ; } ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && { source \"${ENV:=/env}\" 2>/dev/null ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\" --serial \"${SERIAL}\" --board-serial \"${BOARD_SERIAL}\" --uuid \"${UUID}\" --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\" --height \"${HEIGHT:-1080}\" --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ; ./Launch.sh\" ]\n\n
"},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmmacos
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
"},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
"},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
"},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/vmrc/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"VMRC\n
"},{"location":"applications/vmrc/#path","title":"Path","text":"/usr/bin/vmrc\n
"},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"x-scheme-handler/vmrc;\n
"},{"location":"applications/vmrc/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"vmrc.Vmrc\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/vmware-vmrc.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
"},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"json source file vmrc.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"licence\": \"non-free\",\n \"debpackage\": \"\",\n \"icon\": \"circle_vmware.svg\",\n \"keyword\": \"vmrc,vmware,remote,console\",\n \"launch\": \"vmrc.Vmrc\",\n \"name\": \"vmrc\",\n \"displayname\": \"VMRC\",\n \"path\": \"/usr/bin/vmrc\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"x-scheme-handler/vmrc;\",\n \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\",\n \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n ]\n}\n
"},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
"},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmrc
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
"},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
"},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
"},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.vm.ubuntu:22.04
"},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"qemu.Qemu-system-x86_64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file vmubuntu.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"icon\": \"vm-linux-ubuntu.svg\",\n \"keyword\": \"vm,ubuntu,jammy\",\n \"launch\": \"qemu.Qemu-system-x86_64\",\n \"name\": \"vmubuntu\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"devices\": [\n \"/dev/kvm\"\n ],\n \"mem_limit\": \"16G\"\n },\n \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n \"home\": \"/home/balloon\",\n \"cmd\": \"/docker-entrypoint.sh\"\n}\n
"},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
"},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmubuntu
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
"},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
"},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
"},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/vscode/#arguments","title":"Arguments","text":"\"--extensions-dir /usr/share/code/extensions --verbose\"
/usr/bin/code\n
"},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
"},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"
\"c;cpp;py;json;java;md;yml;yaml;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"code.Code\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/code.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
"},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"json source file vscode.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"\",\n \"icon\": \"circle_visual-studio-code.svg\",\n \"keyword\": \"ide,vscode,visual studio code,code\",\n \"launch\": \"code.Code\",\n \"name\": \"VSCode\",\n \"path\": \"/usr/bin/code\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktop\": \"code.desktop\",\n \"host_config\": {\n \"mem_limit\": \"2G\",\n \"shm_size\": \"2G\",\n \"cpu_period\": 200000,\n \"cpu_quota\": 200000,\n \"cap_add\": [\n \"SYS_ADMIN\"\n ]\n },\n \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n \"desktopfile\": \"/usr/share/applications/code.desktop\",\n \"preruncommands\": [\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n ],\n \"quick\": true\n}\n
"},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
"},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application VSCode
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
"},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
"},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
"},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/weather/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"gnome-weather\n
"},{"location":"applications/weather/#path","title":"Path","text":"/usr/bin/gnome-weather\n
"},{"location":"applications/weather/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"org.gnome.Weather.org.gnome.Weather\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Weather.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"json source file weather.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gnome-weather\",\n \"icon\": \"org.gnome.Weather.svg\",\n \"keyword\": \"weather\",\n \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n \"name\": \"weather\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-weather\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
"},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
"},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application weather
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
"},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
"},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
"},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11\n
"},{"location":"applications/whatsdesk/#path","title":"Path","text":"/opt/whatsdesk/whatsdesk\n
"},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"x-scheme-handler/whatsapp;\n
"},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"whatsdesk.whatsdesk\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/whatsdesk.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"json source file whatsdesk.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"dbus-x11\",\n \"icon\": \"whatsapp.svg\",\n \"keyword\": \"whatsapp,whatsdesk\",\n \"launch\": \"whatsdesk.whatsdesk\",\n \"name\": \"whatsdesk\",\n \"path\": \"/opt/whatsdesk/whatsdesk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n \"mimetype\": \"x-scheme-handler/whatsapp;\",\n \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ]\n}\n
"},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
"},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application whatsdesk
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
"},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
"},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
"},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"Winefile Wine (alpine)\n
"},{"location":"applications/winefile-wine/#path","title":"Path","text":"/usr/bin/winefile\n
"},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"winefile.exe.winefile.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"json source file winefile-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"winefile.svg\",\n \"keyword\": \"wine,winfile,winefile,file,manager\",\n \"launch\": \"winefile.exe.winefile.exe\",\n \"name\": \"winefile-wine\",\n \"displayname\": \"Winefile Wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/winefile\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
"},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winefile-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
"},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
"},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
"},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"WineMine Wine (alpine)\n
"},{"location":"applications/winemine-wine/#path","title":"Path","text":"/usr/bin/winemine\n
"},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"winemine.exe.winemine.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
"},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"json source file winemine-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"wine\",\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n ],\n \"icon\": \"winemine.svg\",\n \"keyword\": \"wine,winemine,mine\",\n \"launch\": \"winemine.exe.winemine.exe\",\n \"name\": \"winemine-wine\",\n \"displayname\": \"WineMine Wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/winemine\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
"},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winemine-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
"},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
"},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
"},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.wine
"},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"\"winhelp\"
Winhelp Wine\n
"},{"location":"applications/winhelp-wine/#path","title":"Path","text":"/usr/bin/wine\n
"},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"application/hlp;\n
"},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"\"hlp;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"winhlp32.exe.Wine\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"json source file winhelp-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"winhelp\",\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"winhelp.svg\",\n \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n \"launch\": \"winhlp32.exe.Wine\",\n \"name\": \"winhelp-wine\",\n \"displayname\": \"Winhelp Wine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"application/hlp;\",\n \"fileextensions\": \"hlp;\",\n \"path\": \"/usr/bin/wine\",\n \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
"},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
"},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winhelp-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
"},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
"},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
"},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.wine
"},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"\"/composer/bin/winscp.exe\"
WinSCP\n
"},{"location":"applications/winscp-wine/#path","title":"Path","text":"/usr/bin/wine\n
"},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"winscp.exe.Wine\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"json source file winscp-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"template\": \"abcdesktopio/oc.template.wine\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n ],\n \"args\": \"/composer/bin/winscp.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"winscp.svg\",\n \"keyword\": \"wine,scp,sftp\",\n \"launch\": \"winscp.exe.Wine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"winscp-wine\",\n \"displayname\": \"WinSCP\",\n \"path\": \"/usr/bin/wine\"\n}\n
"},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
"},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winscp-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
"},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
"},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
"},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"wireshark\n
"},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"wireshark (alpine)\n
"},{"location":"applications/wireshark/#path","title":"Path","text":"/usr/bin/wireshark\n
"},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
"},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"\"cap,pcap\"
\"cap\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"wireshark.Wireshark\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.wireshark.Wireshark.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
ENV QT_XCB_NO_MITSHM=1\n
"},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"json source file wireshark.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV QT_XCB_NO_MITSHM=1\"\n ],\n \"apkpackage\": \"wireshark\",\n \"icon\": \"wireshark.svg\",\n \"keyword\": \"capture,network,analyzer\",\n \"launch\": \"wireshark.Wireshark\",\n \"name\": \"wireshark\",\n \"displayname\": \"wireshark (alpine)\",\n \"path\": \"/usr/bin/wireshark\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n \"fileextensions\": \"cap,pcap\",\n \"legacyfileextensions\": \"cap\"\n}\n
"},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
"},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application wireshark
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
"},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
"},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
"},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/writer/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/writer/#arguments","title":"Arguments","text":"\"--writer\"
Writer alpine\n
"},{"location":"applications/writer/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/writer/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
"},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"
\"odf;ott;fodt;uot\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-writer\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-writer.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"json source file writer.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_writer.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-writer\",\n \"name\": \"writer\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"Writer alpine\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"args\": \"--writer\",\n \"uniquerunkey\": \"libreoffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
"},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application writer
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
"},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
"},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
"},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/xclock/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"xclock\n
"},{"location":"applications/xclock/#displayname","title":"Displayname","text":"Xclock\n
"},{"location":"applications/xclock/#path","title":"Path","text":"/usr/bin/xclock\n
"},{"location":"applications/xclock/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"xclock.XClock\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xclock.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"apkpackage\": \"xclock\",\n \"icon\": \"xclock.svg\",\n \"keyword\": \"clock,xclock,time\",\n \"launch\": \"xclock.XClock\",\n \"name\": \"xclock\",\n \"displayname\": \"Xclock\",\n \"path\": \"/usr/bin/xclock\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n \"args\": \"\",\n \"quick\": true\n}\n
"},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
"},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xclock
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
"},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
"},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
"},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/xedit/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"x11-apps x11-utils xbitmaps\n
"},{"location":"applications/xedit/#displayname","title":"Displayname","text":"Xedit\n
"},{"location":"applications/xedit/#path","title":"Path","text":"/usr/bin/xedit\n
"},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"application/text;\n
"},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"\"txt;log;md\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"xedit.Xedit\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xedit.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n \"icon\": \"circle_xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\": \"txt;log;md\",\n \"args\": \"\",\n \"quick\": true\n}\n
"},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
"},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xedit
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
"},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
"},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
"},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"xeyes\n
"},{"location":"applications/xeyes/#path","title":"Path","text":"/usr/bin/xeyes\n
"},{"location":"applications/xeyes/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"xeyes.XEyes\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xeyes.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"xeyes\",\n \"icon\": \"circle_xfce4-eyes.svg\",\n \"keyword\": \"eyes\",\n \"launch\": \"xeyes.XEyes\",\n \"name\": \"xeyes\",\n \"path\": \"/usr/bin/xeyes\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"quick\": true\n}\n
"},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
"},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xeyes
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
"},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
"},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
"},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/xman/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
"},{"location":"applications/xman/#displayname","title":"Displayname","text":"Xman\n
"},{"location":"applications/xman/#path","title":"Path","text":"/usr/bin/xman\n
"},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"application/x-troff;application/x-troff-man;\n
"},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"\"man;roff\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"topBox.Xman\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xman.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n \"icon\": \"circle_xorg.svg\",\n \"keyword\": \"man,xman,help\",\n \"launch\": \"topBox.Xman\",\n \"name\": \"xman\",\n \"displayname\": \"Xman\",\n \"path\": \"/usr/bin/xman\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n \"fileextensions\": \"man;roff\",\n \"args\": \"\"\n}\n
"},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
"},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xman
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
"},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
"},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
"},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/xpad/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"xpad\n
"},{"location":"applications/xpad/#displayname","title":"Displayname","text":"Xpad\n
"},{"location":"applications/xpad/#path","title":"Path","text":"/usr/bin/xpad\n
"},{"location":"applications/xpad/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"xpad.xpad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/xpad.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
"},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"json source file xpad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"xpad\",\n \"icon\": \"xpad.svg\",\n \"keyword\": \"xpad, note, sticky, postit\",\n \"launch\": \"xpad.xpad\",\n \"name\": \"xpad\",\n \"displayname\": \"Xpad\",\n \"path\": \"/usr/bin/xpad\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"fileextensions\": \"\",\n \"args\": \"\",\n \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n ]\n}\n
"},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
"},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xpad
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
"},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
"},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
"},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/xterm/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"xterm sudo\n
"},{"location":"applications/xterm/#arguments","title":"Arguments","text":"\"-xrm 'XTerm*selectToClipboard:true'\"
Xterm (sudo)\n
"},{"location":"applications/xterm/#path","title":"Path","text":"/usr/bin/xterm\n
"},{"location":"applications/xterm/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"xterm.XTerm\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/xterm.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"json source file xterm.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"circle_xterm.svg\",\n \"apkpackage\": \"xterm sudo\",\n \"keyword\": \"xterm,shell,cmd\",\n \"launch\": \"xterm.XTerm\",\n \"name\": \"xterm\",\n \"displayname\": \"Xterm (sudo)\",\n \"path\": \"/usr/bin/xterm\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"quick\": true\n}\n
"},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
"},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xterm
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
"},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
"},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
"},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/youtube/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"firefox\n
"},{"location":"applications/youtube/#arguments","title":"Arguments","text":"\"-P youtube --class=youtube https://www.youtube.com/\"
Youtube\n
"},{"location":"applications/youtube/#path","title":"Path","text":"/usr/bin/firefox\n
"},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"Navigator.youtube\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
"},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"firefox\",\n \"icon\": \"circle_youtube.svg\",\n \"keyword\": \"youtube,tube\",\n \"launch\": \"Navigator.youtube\",\n \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n \"name\": \"youtube\",\n \"displayname\": \"Youtube\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"2G\",\n \"shm_size\": \"2G\"\n },\n \"installrecommends\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n \"preventhomemount\": false,\n \"quick\": true,\n \"preruncommands\": [\n \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n ]\n}\n
"},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application youtube
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
"},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
"},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.3.17
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.3.17.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.3.18
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.3.18.md is created at Wed Jan 31 2024 13:51:24 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.edge.gtk
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n openjdk21 \\\n mesa-vulkan-swrast \\ \n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
file oc.template.alpine.edge.gtk.libreoffice.md is created at Wed Jan 31 2024 14:02:02 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
file oc.template.alpine.edge.gtk.md is created at Wed Jan 31 2024 13:53:07 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.edge.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"inherite abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"inherite abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
file oc.template.alpine.libreoffice.md is created at Fri Jun 23 2023 16:46:45 GMT+0000 (Coordinated Universal Time) by make-docs.js
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/abcdesktopio/oc.template.alpine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.md is created at Wed Jan 31 2024 13:51:26 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"Docker official images alpine:3.17
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.3.17.md is created at Wed Jan 31 2024 13:43:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"Docker official images alpine:3.18
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.3.18.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"Docker official images alpine:edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.edge.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"Docker official images alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.md is created at Wed Jan 31 2024 13:43:34 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n# echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n# echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64' ]; then apk add --no-cache --update wine; fi\n\n
file oc.template.alpine.wine.md is created at Wed Jan 31 2024 14:06:58 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.debian
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.debian.gtk.md is created at Wed Jan 31 2024 13:57:34 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"inherit abcdesktopio/oc.template.debian.minimal
"},{"location":"applications/abcdesktopio/oc.template.debian/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.debian.md is created at Wed Jan 31 2024 13:51:43 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"Docker official images debian:stable-slim
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \\\n && apt-get update && \\\n apt-get install -y --no-install-recommends \\\n nodejs \\\n npm \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.debian.minimal.md is created at Wed Jan 31 2024 13:50:28 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.18.04.md is created at Wed Jan 31 2024 13:51:46 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.20.04.md is created at Wed Jan 31 2024 13:51:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.22.04.md is created at Wed Jan 31 2024 13:51:51 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.18.04.md is created at Wed Jan 31 2024 13:59:21 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.20.04.md is created at Wed Jan 31 2024 13:57:49 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.22.04.md is created at Wed Jan 31 2024 13:57:23 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n default-jre \\\n gsfonts-x11 \\\n && rm -rf /var/lib/apt/lists/* \n\n
file oc.template.ubuntu.gtk.java.md is created at Wed Jan 31 2024 14:02:12 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"inherite abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search language-pack-gnome | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }') \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"inherite abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search language-pack-gnome | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y \\\n at-spi2-core \\\n libreoffice \\\n libreoffice-gtk3 \\\n libreoffice-style-elementary \\\n libreoffice-base-drivers \\\n libreoffice-sdbc-hsqldb \\\n libghc-hdbc-dev \\ \n && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-help | awk '{print $1 }') \\\n# && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \\ \n# $(apt-cache search myspell-dictionary | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\ \n# $(apt-cache search hyphen | awk '{print $1 }') \\\n# && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n# && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-l10n | awk '{print $1 }') \\\n# && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n xfonts-base \\\n dbus-x11 \\\n && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.md is created at Wed Jan 31 2024 13:57:46 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"Docker official images ubuntu:18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.18.04.md is created at Wed Jan 31 2024 13:46:40 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"Docker official images ubuntu:20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.20.04.md is created at Wed Jan 31 2024 13:47:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"Docker official images ubuntu:22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.22.04.md is created at Wed Jan 31 2024 13:47:17 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"inherit nvidia/cuda:12.0.0-base-ubuntu20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.nvidia.20.04.md is created at Wed Jan 31 2024 13:46:51 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"inherit nvidia/cuda:12.0.0-base-ubuntu22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.nvidia.22.04.md is created at Wed Jan 31 2024 13:46:36 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n wget \\\n && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n# are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n# for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes aria2 \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes binutils \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes fuseiso && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes p7zip-full policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n# apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n# apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y \\\n# libnss-mdns-i386 \\\n# libnss-mdns \\ \n# wine-stable && \\\n# apt-get clean \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb && \\\n# dpkg -i libfaudio0_19.07-0~bionic_amd64.deb && \\\n# rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb && \\\n# dpkg -i libfaudio0_19.07-0~bionic_i386.deb && \\\n# rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n# wget -O /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n# wget -O /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n# wget -O /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n apt-get install --yes wine && \\\n apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n apt-get clean\n\n\nRUN apt-get update && \\\n apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n apt-get clean\n\nCOPY composer/updatereg.py /composer\nCOPY composer/init.d/init.wine /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine /composer/init.d/_init.wine\nRUN mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n
file oc.template.ubuntu.wine.md is created at Wed Jan 31 2024 14:06:00 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.wine
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n apt-get install --install-recommends -y \\\n xterm \\\n wget \\\n netcat \\\n file \\\n winbind \\\n gettext \\ \n libgettextpo-dev \\\n && rm -rf /var/lib/apt/lists/* \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n libosmesa6:i386 \\\n libnss-mdns \\\n libnss-mdns:i386 \\\n libncurses5:i386 \\\n libodbc1:i386 \\\n libxext6:i386 \\\n libxi6:i386 \\\n libfreetype6:i386 \\\n libx11-6:i386 \\\n libz1:i386 \\\n libcups2:i386 \\\n liblcms2-2:i386 \\\n libglu1-mesa:i386 \\\n libxcursor1:i386 \\\n libxrandr2:i386 \\\n libxml2:i386 \\\n libgl1-mesa-dri:i386 \\\n libgl1-mesa-glx:i386 \\\n && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n rm PlayOnLinux_4.3.4.deb && \\\n rm -rf /var/lib/apt/lists/*\n\n
file oc.template.ubuntu.wine.mswindow.md is created at Wed Jan 31 2024 14:08:19 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"#!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"NAME=\"John\"\necho \"Hi $NAME\" #=> Hi John\necho 'Hi $NAME' #=> Hi $NAME\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n
See Command substitution
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"git commit && git push\ngit commit || echo \"Commit failed\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"{: id='functions-example'}
get_name() {\n echo \"John\"\n}\n\necho \"You are $(get_name)\"\n
See: Functions
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"{: id='conditionals-example'}
if [[ -z \"$string\" ]]; then\n echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n echo \"String is not empty\"\nfi\n
See: Conditionals
","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"set -euo pipefail\nIFS=$'\\n\\t'\n
See: Unofficial bash strict mode
","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"echo {A,B}.js\n
| {A,B}
| Same as A B
| | {A,B}.js
| Same as A.js B.js
| | {1..5}
| Same as 1 2 3 4 5
|
See: Brace expansion
","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"name=\"John\"\necho ${name}\necho ${name/J/j} #=> \"john\" (substitution)\necho ${name:0:2} #=> \"Jo\" (slicing)\necho ${name::2} #=> \"Jo\" (slicing)\necho ${name::-1} #=> \"Joh\" (slicing)\necho ${name:(-1)} #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake} #=> $food or \"Cake\"\n
length=2\necho ${name:0:length} #=> \"Jo\"\n
See: Parameter expansion
STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp} # /path/to/foo\necho ${STR%.cpp}.o # /path/to/foo.o\n\necho ${STR##*.} # cpp (extension)\necho ${STR##*/} # foo.cpp (basepath)\n\necho ${STR#*/} # path/to/foo.cpp\necho ${STR##*/} # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
STR=\"Hello world\"\necho ${STR:6:5} # \"world\"\necho ${STR:-5:5} # \"world\"\n
SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/} #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE} #=> \"/path/to/\" (dirpath)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix}
Remove suffix ${FOO#prefix}
Remove prefix --- --- ${FOO%%suffix}
Remove long suffix ${FOO##prefix}
Remove long prefix --- --- ${FOO/from/to}
Replace first match ${FOO//from/to}
Replace all --- --- ${FOO/%from/to}
Replace suffix ${FOO/#from/to}
Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"# Single line comment\n
: '\nThis is a\nmulti line\ncomment\n'\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"| ${FOO:0:3}
| Substring (position, length) | | ${FOO:-3:3}
| Substring from the right |
| ${#FOO}
| Length of $FOO
|
STR=\"HELLO WORLD!\"\necho ${STR,} #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,} #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^} #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^} #=> \"HELLO WORLD!\" (all uppercase)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"| ${FOO:-val}
| $FOO
, or val
if not set | | ${FOO:=val}
| Set $FOO
to val
if not set | | ${FOO:+val}
| val
if $FOO
is set | | ${FOO:?message}
| Show error message and exit if $FOO
is not set |
The :
is optional (eg, ${FOO=word}
works)
{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"for i in /etc/rc.*; do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"for ((i = 0 ; i < 100 ; i++)); do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"for i in {1..5}; do\n echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"for i in {5..50..5}; do\n echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"cat file.txt | while read line; do\n echo $line\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"while true; do\n \u00b7\u00b7\u00b7\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"myfunc() {\n echo \"hello $1\"\n}\n
# Same as above (alternate syntax)\nfunction myfunc() {\n echo \"hello $1\"\n}\n
myfunc \"John\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"myfunc() {\n local myresult='some value'\n echo $myresult\n}\n
result=\"$(myfunc)\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"myfunc() {\n return 1\n}\n
if myfunc; then\n echo \"success\"\nelse\n echo \"failure\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $#
Number of arguments $*
All arguments $@
All arguments, starting from first $1
First argument $_
Last argument of the previous command See Special parameters.
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"Note that [[
is actually a command/program that returns either 0
(true) or 1
(false). Any program that obeys the same logic (like all base utils, such as grep(1)
or ping(1)
) can be used as condition, see examples.
[[ -z STRING ]]
Empty string [[ -n STRING ]]
Not empty string [[ STRING == STRING ]]
Equal [[ STRING != STRING ]]
Not Equal --- --- [[ NUM -eq NUM ]]
Equal [[ NUM -ne NUM ]]
Not equal [[ NUM -lt NUM ]]
Less than [[ NUM -le NUM ]]
Less than or equal [[ NUM -gt NUM ]]
Greater than [[ NUM -ge NUM ]]
Greater than or equal --- --- [[ STRING =~ STRING ]]
Regexp --- --- (( NUM < NUM ))
Numeric conditions Condition Description [[ -o noclobber ]]
If OPTIONNAME is enabled --- --- [[ ! EXPR ]]
Not [[ X ]] && [[ Y ]]
And [[ X ]] || [[ Y ]]
Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]]
Exists [[ -r FILE ]]
Readable [[ -h FILE ]]
Symlink [[ -d FILE ]]
Directory [[ -w FILE ]]
Writable [[ -s FILE ]]
Size is > 0 bytes [[ -f FILE ]]
File [[ -x FILE ]]
Executable --- --- [[ FILE1 -nt FILE2 ]]
1 is more recent than 2 [[ FILE1 -ot FILE2 ]]
2 is more recent than 1 [[ FILE1 -ef FILE2 ]]
Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"# String\nif [[ -z \"$string\" ]]; then\n echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n echo \"String is not empty\"\nfi\n
# Combinations\nif [[ X ]] && [[ Y ]]; then\n ...\nfi\n
# Equal\nif [[ \"$A\" == \"$B\" ]]\n
# Regex\nif [[ \"A\" =~ . ]]\n
if (( $a < $b )); then\n echo \"$a is smaller than $b\"\nfi\n
if [[ -e \"file.txt\" ]]; then\n echo \"file exists\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"Fruits=('Apple' 'Banana' 'Orange')\n
Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"echo ${Fruits[0]} # Element #0\necho ${Fruits[@]} # All elements, space-separated\necho ${#Fruits[@]} # Number of elements\necho ${#Fruits} # String length of the 1st element\necho ${#Fruits[3]} # String length of the Nth element\necho ${Fruits[@]:3:2} # Range (from position 3, length 2)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"Fruits=(\"${Fruits[@]}\" \"Watermelon\") # Push\nFruits+=('Watermelon') # Also Push\nFruits=( ${Fruits[@]/Ap*/} ) # Remove by regex match\nunset Fruits[2] # Remove one item\nFruits=(\"${Fruits[@]}\") # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`) # Read from file\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"for i in \"${arrayName[@]}\"; do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"declare -A sounds\n
sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n
Declares sound
as a Dictionary object (aka associative array).
echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]} # All values\necho ${!sounds[@]} # All keys\necho ${#sounds[@]} # Number of elements\nunset sounds[dog] # Delete dog\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"for val in \"${sounds[@]}\"; do\n echo $val\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"for key in \"${!sounds[@]}\"; do\n echo $key\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"set -o noclobber # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit # Used to exit upon error, avoiding cascading errors\nset -o pipefail # Unveils hidden failures\nset -o nounset # Exposes unset variables\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"shopt -s nullglob # Non-matching globs are removed ('*.foo' => '')\nshopt -s failglob # Non-matching globs throw errors\nshopt -s nocaseglob # Case insensitive globs\nshopt -s dotglob # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n
Set GLOBIGNORE
as a colon-separated list of patterns to be removed from glob matches.
| history
| Show history | | shopt -s histverify
| Don't execute expanded result immediately |
| !$
| Expand last parameter of most recent command | | !*
| Expand all parameters of most recent command | | !-n
| Expand n
th most recent command | | !n
| Expand n
th command in history | | !<command>
| Expand most recent invocation of command <command>
|
| !!
| Execute last command again | | !!:s/<FROM>/<TO>/
| Replace first occurrence of <FROM>
to <TO>
in most recent command | | !!:gs/<FROM>/<TO>/
| Replace all occurrences of <FROM>
to <TO>
in most recent command | | !$:t
| Expand only basename from last parameter of most recent command | | !$:h
| Expand only directory from last parameter of most recent command |
!!
and !$
can be replaced with any valid expansion.
| !!:n
| Expand only n
th token from most recent command (command is 0
; first argument is 1
) | | !^
| Expand first argument from most recent command | | !$
| Expand last token from most recent command | | !!:n-m
| Expand range of tokens from most recent command | | !!:n-$
| Expand n
th token to last from most recent command |
!!
can be replaced with any valid expansion i.e. !cat
, !-2
, !42
, etc.
$((a + 200)) # Add 200 to $a\n
$((RANDOM%=200)) # Random number 0..200\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"(cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"python hello.py > output.txt # stdout to (file)\npython hello.py >> output.txt # stdout to (file), append\npython hello.py 2> error.log # stderr to (file)\npython hello.py 2>&1 # stderr to stdout\npython hello.py 2>/dev/null # stderr to (null)\npython hello.py &>/dev/null # stdout and stderr to (null)\n
python hello.py < foo.txt # feed foo.txt to stdin for python\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"command -V cd\n#=> \"cd is a function/alias/whatever\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"trap 'echo Error at about $LINENO' ERR\n
or
traperr() {\n echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"case \"$1\" in\n start | up)\n vagrant up\n ;;\n\n *)\n echo \"Usage: $0 {start|stop|ssh}\"\n ;;\nesac\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"source \"${0%/*}/../share/foo.sh\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"DIR=\"${0%/*}\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n -V | --version )\n echo $version\n exit\n ;;\n -s | --string )\n shift; string=$1\n ;;\n -f | --flag )\n flag=1\n ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"cat <<END\nhello world\nEND\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
read -n 1 ans # Just one character\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"| $?
| Exit status of last task | | $!
| PID of last background task | | $$
| PID of shell | | $0
| Filename of the shell script |
See Special parameters.
","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"if ping -c 1 google.com; then\n echo \"It appears you have a working internet connection\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"if grep -q 'foo' ~/.bash_history; then\n echo \"You appear to have typed 'foo' in the past\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"{: .-one-column}
docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
"},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"docker rm `docker ps -a -q -f \"status=exited\"`\n
"},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"docker rmi `docker images -q --filter \"dangling=true\"`\n
"},{"location":"cheatsheets/macos/","title":"Macos","text":"Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.
At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.
To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac
To get a shell to the LinuxKit docker-desktop
, run the docker command
docker run -it --rm --privileged --pid=host justincormack/nsenter1\n
more info: https://github.com/justincormack/nsenter1
"},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":"To restrict access to applications using authentication label, you need to define an acl
entry in the application dictionary object.
\"acl\": { \"permit\": [ \"tag\" ] },\n
For example using the application xedit
all
is a special label for everything. The xedit
application can be run for all tags.
{\n \"acl\": { \"permit\": [ \"all\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.
"},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"You can read the chapter authentification-rules to define some autenticated labels.
Update the od.config file, to add a label mylocal
if the source ip address is in local network 192.168.0.0/16
authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous',\n 'policies': { \n 'acl' : { 'permit': [ 'all' ] }, \n 'rules' : \n { 'rule-net-home': { \n 'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n 'expected' : True,\n 'label' : 'localnet'\n } \n } \n } \n } \n } \n } \n} \n\n
Restart the pyos service
kubectl delete pod -l run-pyos-od -n abcdesktop\n
When your services are restarted, launch your web browser
Login to your abcdesktop service and choose anonymous authentication
Check the label set during the authentication process
Goto the menu option at the right up corner, choose Settings
| User
| Session
You should read the label localnet
in the Anonymous user information.
You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.
"},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"Create a edit.json file with the content :
{\n \"acl\": { \"permit\": [ \"localhost\", \"localnet\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.
Make sure that you have installed nodejs
To install make.js
command
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n
Create icons
directory
mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n
Run the make command
node make.js -f xedit.json Dockerfile\n
You should read on standard output
myArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n acl: { permit: [ 'all' ] },\n cat: 'utilities',\n debpackage: 'x11-apps',\n icon: 'xedit.svg',\n keyword: 'text,notepad,edit,txt,editor,xedit',\n launch: 'xedit.Xedit',\n name: 'xedit',\n displayname: 'Xedit',\n path: '/usr/bin/xedit',\n template: 'abcdesktopio/oc.template.gtk',\n mimetype: 'application/text;',\n fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n
Look at the new Dockerfile
, and build the new docker image for xedit
docker build -t xedit.d .\n
You should read on standard output
[+] Building 13.0s (11/11) FINISHED \n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 2.01kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev 2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io 0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB 0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps && apt-get clean 8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.4s\n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.3s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.3s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 0.3s \n => => exporting layers 0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878 0.0s\n => => naming to docker.io/library/xedit.d \n
Then look at the acl label
docker inspect xedit.d | grep oc.acl\n
\"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n
The acl is stringified json object.
"},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"The xedit application is listed only if your are connected from a local network matching the previous rules.
Look for the application xedit
, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :
Launch the xedit
application
To update the acl
of xedit
application, edit the edit.json file with the content, and set nowhere
tag in acl
array :
{\n \"acl\": { \"permit\": [ \"nowhere\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
Then, rebuild Dockerfile
and the docker image
of the xedit application
node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
% node make.js -f xedit.json Dockerfile\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n acl: { permit: [ 'nowhere' ] },\n cat: 'utilities',\n debpackage: 'x11-apps',\n icon: 'xedit.svg',\n keyword: 'text,notepad,edit,txt,editor,xedit',\n launch: 'xedit.Xedit',\n name: 'xedit',\n displayname: 'Xedit',\n path: '/usr/bin/xedit',\n template: 'abcdesktopio/oc.template.gtk',\n mimetype: 'application/text;',\n fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED \n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 4.19kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev 1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io 0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps && apt-get clean 0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.0s\n => CACHED [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.0s\n => CACHED [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.0s\n => CACHED [6/6] WORKDIR /home/balloon 0.0s\n => exporting to image 0.0s\n => => exporting layers 0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903 0.0s\n => => naming to docker.io/library/xedit.d \n
Launch your web browser, and log in to your abcdesktop service
Check that xedit
is not found and not listed.
The new acl
does not allow the xedit
application to be run and show. You can now define your own rules, add set the access control list to your applications.
To update the default wallpaper file, add a ENV
variable in the desktop.envlocal
dictionary.
SET_DEFAULT_WALLPAPER
to the value like welcometoabcdesktop.png
. The file welcometoabcdesktop.png
already exists in the /composer/wallpapers
directory of your abcdesktopio/oc.user.XX.YY container image.desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'USER' : 'balloon',\n 'LOGNAME' : 'balloon',\n 'LIBOVERLAY_SCROLLBAR' : '0',\n 'UBUNTU_MENUPROXY' : '0',\n 'HOME' : '/home/balloon',\n 'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n } \n
ENV
dictionary will be use to start a new user container./composer/wallpapers
directoryNot For a development environment, add the TAG dev
FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n
To build the new docker image, run the command line
docker build -t abcdesktopio/oc.user.18.04 .\n
You should read on the standard output :
Sending build context to Docker daemon 3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
"},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"To update the default wallpaper file, add a ENV
variable in the desktop.envlocal
dictionary.
SET_DEFAULT_WALLPAPER
to the value like silas-baisch-unsplash.jpg
. The file silas-baisch-unsplash.jpg
exists in the /composer/wallpapers
directory of your new abcdesktopio/oc.user.18.04
container image.desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'USER' : 'balloon',\n 'LOGNAME' : 'balloon',\n 'LIBOVERLAY_SCROLLBAR' : '0',\n 'UBUNTU_MENUPROXY' : '0',\n 'HOME' : '/home/balloon',\n 'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n } \n
ENV
dictionary will be use to start a new user container.docker
or ctr
package should be install on your Linux (optional)Start an containerised application, I choose 2048
application, for example.
Using the web browser, choose Settings
in the menu.
Choose Tasks
to list all running containers
Choose Logs
to read the stdout log file of an application
This application write on stdout
Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"You will read the sample stdout line, using a docker logs
command, open a shell on you host.
In a shell on your host, look for the container id
of the 2048
containerised application
$ docker ps -a|grep 2048\n01579054a1f6 abcdesktopio/ubuntu-2048.d:3.0 \"/composer/appli-doc\u2026\" 21 minutes ago Up 21 minutes anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n
Read the log file form the docker logs
command
$ docker logs 01579054a1f6\n
You should read on output the same lines written on the web interface
Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr
and stdout
","text":"The main log files are lastcmd.log
lastcmdenv.log
and $APPBIN.log
:
/tmp/lastcmd.log
: contains the stdout file of the init script command /composer/appli-docker-entrypoint.sh
for latest running application/tmp/lastcmdenv.log
: contains the dump of all environment variables for latest running application/tmp/$APPBIN.log
: contains stderr
and stdout
of the application $APPBIN
. $APPBIN
should be replace by the name of your binary application filename.By default, with all abcdesktop templates, applications redirect stderr
to stdout
and pipe to a tee.
${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n
By default, the /tmp
volume is shared with all containers. So to debug and read log applications, you can run a webshell
to have an access to stdout
and stderr
content.
The var $BASENAME_APP
is the name of your application
BASENAME_APP=$(basename \"$APPBIN\")\n
and APPBIN
is path
to the binary
Example with the 2048-qt
application
APPBIN=/usr/games/2048-qt\n
The /tmp
directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp
directory
balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root root 260 Dec 1 09:58 .\ndrwxr-xr-x 1 root root 4096 Dec 1 09:55 ..\n-rw-r--r-- 1 balloon balloon 102 Dec 1 09:58 2048-qt.log\nsrwxrwxrwx 1 root root 0 Dec 1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon 0 Dec 1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec 1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon 437 Dec 1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon 60 Dec 1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon 0 Dec 1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon 40 Dec 1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon 11 Dec 1 09:55 .X0-lock\ndrwxrwxrwt 2 root root 60 Dec 1 09:55 .X11-unix\nsrw------- 1 balloon balloon 0 Dec 1 09:55 .x11vnc\nballoon:~$\n
The files are /tmp/lastcmd.log
, /tmp/lastcmdenv.log
and /tmp/2048-qt.log
.
/tmp/lastcmd.log
the init command log file created by /composer/appli-docker-entrypoint.sh
/tmp/lastcmdenv.log
the last environment variables file/tmp/2048-qt.log
the command log file for the applicationDump the /tmp/2048-qt.log
, with a cat command cat /tmp/2048-qt.log
. Replace /tmp/2048-qt.log
by your own application (binary) if you choose another application.
You can run all bash commands inside the webshell
.
balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
Dump the /composer/appli-docker-entrypoint.sh
result in /tmp/lastcmd.log
, with a cat command cat /tmp/lastcmd.log
.
balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n
Dump all environment variables in file /tmp/lastcmdenv.log
.
balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n
We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.
In next chapter we will start an application from a fresh ubuntu image, to get more details.
"},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation
button.
Choose Add
as a response to the question Add abcdesktop Clipboad Helper ?
Press OKay, Got it
to confirm the abcdesktop Clipboad helper
insallation
Firefox clipboard extension runs ONLY if the hostname contains desktop
string.
The URL must matches *://*desktop*/*\"
to run the clipboard extension.
https://demo.abcdesktop.io
matches, the firefox clipboard extension is running.https://desktop.domain.io
matches, the firefox clipboard extension is running.https://abcdesktop.mydomain.local
matches, the firefox clipboard extension is running.https://demo.domain.com
does not match, the firefox clipboard extension is not running.Firefox clipboard extension syncs only text data, binary data like images are not yet supported.
Firefox clipboard extension syncs your clipboard data selected from your abcdesktop desktop to your local desktop environment.
Firefox clipboard extension syncs your local desktop environment clipboard to your abcdesktop desktop clipboard.
Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.
Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.
Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.
Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.
"},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":"Edit the mms.cfg file, and add your own website url
EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n
Add the a new line and replace https://www.domain.com
by your own web site
AllowListURLPattern=https://www.domain.com\n
"},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"Create a Dockerfile firefox-esr.d
mms.cfg
into the directory /etc/adobe
of your container imageFROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
"},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"Run the docker build command
docker build -t firefox-esr.d -f firefox-esr.d .\n
"},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Using you web browser, log in to your abcdesktop service
Look at the twice firefox icon for Firefox
and Firefox-esr
application.
Start the application Firefox-esr
Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site
Click to the Run Adobe Flash
plugins
And Allow the Adobe Flash to run
Great, you can run the Adobe Flash plugins.
"},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and buildCitrix Receiver
for abcdesktop","text":"Citrix Workspace App
or Citrix Receiver
does not exist in official debian repository. You need to download the deb package
from the www.citrix.com website manually.
git clone https://github.com/abcdesktopio/oc.apps.git\n
Download the Citrix Receiver for Linux .deb package. Go to https://www.citrix.com/downloads/citrix-receiver/linux/receiver-for-linux-latest.html
Copy the downloaded file icaclient_13.10.0.20_amd64.deb
for example as icaclient_amd64.deb to your local oc.apps directory
cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
Sending build context to Docker daemon 29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
abcdesktopio/citrix.d:dev
is ready to runDoes a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?
Let's have a look !
There are two ways to use shared memory in Linux: System V
and POSIX
.
shmget
/ shmat
/ shmdt
for the System V
method.shm_open
/ mmap
/ shm_unlink
for the POSIX
method.kubectl
command-line tool must be configured to communicate with your cluster. To install the bash and yaml files, run the command
git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
"},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"Goal: Test System V shared memory
between two containers inside the same pod
This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.
The test is successful if there is no system error and the strings are equals.
The string MemContents stored in the shared memory is : This is the way the world ends...
int exit_code = -1;\n // ftok to generate unique key \n key_t key = ftok(\"/shared/shmfile\",65);\n // shmget returns an identifier in shmid \n int shmid = shmget(key,1024,0666|IPC_CREAT);\n // shmat to attach to shared memory \n char *str = (char*) shmat(shmid,(void*)0,0);\n strcpy( str, MemContents );\n //detach from shared memory \n exit_code = shmdt(str);\n
// ftok to generate unique key \n key_t key = ftok(\"/shared/shmfile\",65);\n // shmget returns an identifier in shmid \n int shmid = shmget(key,1024,0666|IPC_CREAT);\n // shmat to attach to shared memory \n char *str = (char*) shmat(shmid,(void*)0,0);\n printf(\"%s\\n\",str);\n cmp_code = strcmp( str, MemContents );\n //detach from shared memory \n exit_code = shmdt(str);\n
To run the System V
tests
In this yaml file, sender and receiver containers share a file. This file is /shared/me
and it is the first parameter to ftok
system V call.
apiVersion: v1\nkind: Pod\nmetadata:\n name: podsysvsendershmtest\nspec:\n shareProcessNamespace: true\n restartPolicy : Never\n volumes:\n - name: shared \n emptyDir: {}\n containers:\n - name: sender\n imagePullPolicy: IfNotPresent\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/shared/me\"\n - name: receiver\n imagePullPolicy: IfNotPresent\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/shared/me\"\n
The env var FTOK_PATH
set the first parameter to ftok
system V call.
Run the test
# this test result is success\n./runtest.sh podsendershared_success.yaml\n
You can read the same string from sender to receive container.
This test is OK.
pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
"},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"In this yaml file, sender and receiver do not share file. /dummy
filename is the first parameter to ftok
system V call.
apiVersion: v1\nkind: Pod\nmetadata:\n name: podsysvsendershmtest\nspec:\n shareProcessNamespace: true\n restartPolicy : Never\n volumes:\n - name: shared \n emptyDir: {}\n containers:\n - name: sender\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/dummy\"\n - name: receiver\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/dummy\"\n
The env var FTOK_PATH
set the first parameter to ftok
system V call.
Run the test
# this test result is failed\n./runtest.sh podsendershared_failed.yaml\n
You can read that the sender write a string. The receiver does not read this string.
This test is KO.
pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n
The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers
"},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"Goal: Test Posix shared memory
between two containers inside the same pod
The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin
This test creates two containers a sender and a receiver to read a shared memory in /dev/shm
, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.
The string MemContents
stored in the shared memory is : This is the way the world ends...
/shMemEx
int fd = shm_open(BackingFile, /* name from smem.h */\n O_RDWR | O_CREAT, /* read/write, create if needed */\n AccessPerms); /* access permissions (0644) */\n if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n ftruncate(fd, ByteSize); /* get the bytes */\n\n caddr_t memptr = mmap(NULL, /* let system pick where to put segment */\n ByteSize, /* how many bytes */\n PROT_READ | PROT_WRITE, /* access protections */\n MAP_SHARED, /* mapping visible to other processes */\n fd, /* file descriptor */\n 0); /* offset: start at 1st byte */\n if ((caddr_t) -1 == memptr) report_and_exit(\"Can't get segment...\");\n\n fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n fprintf(stderr, \"backing file: /dev/shm%s\\n\", BackingFile );\n\n /* semahore code to lock the shared mem */\n sem_t* semptr = sem_open(SemaphoreName, /* name */\n O_CREAT, /* create the semaphore */\n AccessPerms, /* protection perms */\n 0); /* initial value */\n if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n /* increment the semaphore so that memreader can read */\n if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n sleep(12); /* give reader a chance */\n\n /* clean up */\n munmap(memptr, ByteSize); /* unmap the storage */\n close(fd);\n sem_close(semptr);\n shm_unlink(BackingFile); /* unlink from the backing file */\n\n
int fd = shm_open(BackingFile, O_RDWR, AccessPerms); /* empty to begin */\n if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n /* get a pointer to memory */\n caddr_t memptr = mmap(NULL, /* let system pick where to put segment */\n ByteSize, /* how many bytes */\n PROT_READ | PROT_WRITE, /* access protections */\n MAP_SHARED, /* mapping visible to other processes */\n fd, /* file descriptor */\n 0); /* offset: start at 1st byte */\n if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n /* create a semaphore for mutual exclusion */\n sem_t* semptr = sem_open(SemaphoreName, /* name */\n O_CREAT, /* create the semaphore */\n AccessPerms, /* protection perms */\n 0); /* initial value */\n if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n int i;\n for (i = 0; i < strlen(MemContents); i++)\n write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n sem_post(semptr);\n }\n\n /* cleanup */\n munmap(memptr, ByteSize);\n close(fd);\n sem_close(semptr);\n unlink(BackingFile);\n
To run the POSIX
test
kubectl create -f podposixshm.yaml \npod/podposixshm created\n
The podposixshm
pod status must be Completed
kubectl get pods podposixshm \nNAME READY STATUS RESTARTS AGE\npodposixshm 0/2 Completed 0 27s\n
The podposixshm sender log file should be :
kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file: /dev/shm/shMemEx\n
The pod/podposixshm receiver log file should be :
kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n
Delete the podposixshm
pod
kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
"},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"On a pod, we can see that the default size of /dev/shm
is 64MB, when running the df /dev/shm
command.
kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\nshm 65536 65536 0 100% /dev/shm\n
A dd
command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.
Run the dd
command
dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n
Run the df /dev/shm
command
df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\nshm 65536 65536 0 100% /dev/shm\n
Delete the shmtest
pod
kubectl delete pods shmtest\npod \"shmtest\" deleted\n
The default size is 64 MB.
"},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"Create a updateshm.yaml
file with the yaml content
apiVersion: v1\nkind: Pod\nmetadata:\n labels:\n run: updateshm\n name: updateshm\nspec:\n volumes: \n - name: volumeshm\n emptyDir:\n medium: Memory\n containers:\n - image: alpine:edge\n name: updateshm\n args: \n - 1d \n command: \n - /bin/sleep\n volumeMounts: \n - mountPath: /dev/shm\n name: volumeshm\n dnsPolicy: ClusterFirst\n restartPolicy: Never\n
Create the new pod updateshm
kubectl apply -f updateshm.yaml \npod/updateshm created\n
Execute a df /dev/shm
command inside this pods to read the size of /dev/shm
kubectl exec updateshm -- df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\ntmpfs 16176264 0 16176264 0% /dev/shm\n
The size of /dev/shm
is 16176264 of 1K blocks. The new default size is 16 GB.
To set a fixed limit use the sizeLimit
in the spec.volumes
apiVersion: v1\nkind: Pod\nmetadata:\n labels:\n run: updateshm512\n name: updateshm512\nspec:\n volumes: \n - name: updateshm512\n emptyDir:\n medium: Memory\n sizeLimit: 512Mi\n containers:\n - image: alpine:edge\n name: updateshm\n args: \n - 1d \n command: \n - /bin/sleep\n volumeMounts: \n - mountPath: /dev/shm\n name: updateshm512\n dnsPolicy: ClusterFirst\n restartPolicy: Never\n
"},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":"To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop
Then, start the filemanager, your new file is located in your home directory
"},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"To download file from your abcdesktop to you local storage, just start the file manager.
Choose your file and using the right mouse button, choose the menu option Download for Desktop
as describe :
The file is downloaded by your web browser
The file is located in your Downloads
directory
Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.
"},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine
"},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"To get the installation script and the vagrant file, run the command
git clone https://github.com/abcdesktopio/vagrant.git\n
Vagrantfile.kubernetes.bastion
abcdesktop_kubernetes_bastion.sh
kmaster
vm","text":"Run the command to run the vagrant file
$ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n
This vagrant file defines a vm kmaster
:
kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n v.name = \"kmaster\"\n v.memory = 4096\n v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n
It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )
All networks are defined as private_network
to make it simplest as possible.
abcdesktop_kubernetes_bastion.sh
description","text":"abcdesktop_kubernetes_bastion.sh
takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64
:
Read step by step the abcdesktop_kubernetes_bastion.sh
content to get more details.
You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file
"},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into thekmaster
vm","text":"VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
List kube-system
pods and abcdesktop
pods
To run kubectl commands inside the master virtual machine
export KUBECONFIG=/etc/kubernetes/admin.conf \n
vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME READY STATUS RESTARTS AGE\ncoredns-64897985d-4d57p 1/1 Running 0 11h\ncoredns-64897985d-qtmkq 1/1 Running 0 11h\netcd-kmaster 1/1 Running 0 11h\nkube-apiserver-kmaster 1/1 Running 0 11h\nkube-controller-manager-kmaster 1/1 Running 0 11h\nkube-flannel-ds-gskrs 1/1 Running 0 11h\nkube-proxy-c566l 1/1 Running 0 11h\nkube-scheduler-kmaster 1/1 Running 0 11h\n
vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\ndaemonset-nginx-pt2j6 1/1 Running 0 11h\ndaemonset-pyos-zqpf7 1/1 Running 0 11h\nmemcached-od-78578c879-kstcl 1/1 Running 0 11h\nmongodb-od-5c68794bb8-wf6sm 1/1 Running 0 11h\nopenldap-od-558f7959d5-vhbln 1/1 Running 0 11h\nspeedtest-od-7b66cc656b-fh97g 1/1 Running 0 11h\n
"},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your web browser to
http://[your-ip-hostname]:30443/\n
Replace [your-ip-hostname]
by the host node IP address
You should get the web page
"},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"abcdesktop
adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server
Use the credentials, to login
Philip J. Fry
fry
After the login, you should get the default desktop.
"},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"To start a shell, insert webshell
as keywords in the search text area :
ifconfig
command to list network interfaces","text":"In the web shell, run the command
$ ifconfig -a\n
This command shows the network interfaces net1
and net2
with the associated ip address
kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
"},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml
","text":"Open the abcdesktop.yaml
configuration file, and look at ldapconfig
ldapconfig : { 'planet': { 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'openldap.abcdesktop.svc.cluster.local' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': {\n 'acls': None,\n 'rules' : {\n 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' },\n 'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
openldap.abcdesktop.svc.cluster.local
is a local ldap server running as a pod'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' }
If a user is member of 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
then the label
tag shipcrew
is set to the user's pod
'rule-admin': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' }
If a user is member of 'cn=admin_staff,ou=people,dc=planetexpress,dc=com'
then the label
tag adminstaff
is set to the user's pod
In the abcdesktop.yaml
configuration file, and look at the desktop.policies
and the network
option
desktop.policies: {\n 'rules': {\n 'network': {\n 'shipcrew': {\n 'annotations' : {\n 'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n }\n }\n }\n },\n 'acls' : {} }\n
If a pod as the 'shipcrew'
tag, then add the network annotations
[ \n { \"name\": \"macvlan-conf-eth3\"}, \n { \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
"},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop
namespace","text":"To list pod in the abcdesktop
namespace, run the command
export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\ndaemonset-nginx-5dzjc 1/1 Running 0 151m\ndaemonset-pyos-szs8h 1/1 Running 0 151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308 3/3 Running 0 86m\nmemcached-od-78578c879-vx26h 1/1 Running 0 151m\nmongodb-od-6568f85897-tgfjb 1/1 Running 0 151m\nopenldap-od-558f7959d5-qz2kg 1/1 Running 0 151m\nspeedtest-od-76d578578d-rl8k8 1/1 Running 0 151m\n
"},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"Run the command
kubectl describe pods YOUR_POD\n
Replace YOUR_POD by your pod
root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName: fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace: abcdesktop\nPriority: 0\nNode: kmaster/10.0.2.15\nStart Time: Mon, 31 Jan 2022 16:14:16 +0000\nLabels: access_provider=planet\n access_userid=FRY\n access_username=philip_j__fry\n broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n domain=desktop\n netpol/ocuser=true\n pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n shipcrew=true\n type=x11server\n xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n
The label shipcrew=true
is set
Annotations: k8s.v1.cni.cncf.io/network-status:\n [{\n \"name\": \"cbr0\",\n \"interface\": \"eth0\",\n \"ips\": [\n \"10.244.0.12\"\n ],\n \"mac\": \"06:17:a7:0c:24:9b\",\n \"default\": true,\n \"dns\": {}\n },{\n \"name\": \"abcdesktop/macvlan-conf-eth3\",\n \"interface\": \"net1\",\n \"ips\": [\n \"192.168.29.12\"\n ],\n \"mac\": \"3a:db:a1:33:53:72\",\n \"dns\": {}\n },{\n \"name\": \"abcdesktop/macvlan-conf-eth2\",\n \"interface\": \"net2\",\n \"ips\": [\n \"10.9.1.12\"\n ],\n \"mac\": \"86:eb:43:fe:db:e7\",\n \"dns\": {}\n }]\n
The Annotations
k8s.v1.cni.cncf.io/network-status
describes the network interfaces inside the pod.
Run the command
kubectl get net-attach-def -n abcdesktop\n
root@kmaster:~# kubectl get net-attach-def -n abcdesktop\nNAME AGE\nmacvlan-conf-eth2 154m\nmacvlan-conf-eth3 154m\n
Get more details about macvlan-conf-eth3
root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName: macvlan-conf-eth3\nNamespace: abcdesktop\nLabels: <none>\nAnnotations: <none>\nAPI Version: k8s.cni.cncf.io/v1\nKind: NetworkAttachmentDefinition\nMetadata:\n Creation Timestamp: 2022-01-31T15:10:38Z\n Generation: 1\n Managed Fields:\n API Version: k8s.cni.cncf.io/v1\n Fields Type: FieldsV1\n fieldsV1:\n f:metadata:\n f:annotations:\n .:\n f:kubectl.kubernetes.io/last-applied-configuration:\n f:spec:\n .:\n f:config:\n Manager: kubectl-client-side-apply\n Operation: Update\n Time: 2022-01-31T15:10:38Z\n Resource Version: 1008\n UID: a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n Config: { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents: <none>\n
macvlan-conf-eth3
is used by the user's pod.
To list multi-policy, run the command
kubectl get multi-policy -n abcdesktop\n
root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME AGE\nmnp-permit-shipcrew 3h\n
And get description about the policy mnp-permit-shipcrew
apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n name: mnp-permit-shipcrew\n namespace: abcdesktop \n annotations:\n k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n podSelector:\n matchLabels:\n shipcrew: 'true' \n policyTypes:\n - Egress\n egress:\n - to:\n - ipBlock: \n cidr: 192.168.55.21/32\n - ipBlock:\n cidr: 192.168.55.22/32\n ports:\n - protocol: TCP\n port: 22\n
If a pod in the abcdesktop
namespace, contains a label shipcrew: 'true'
set the iptables
to permit egress to host 192.168.55.21/32
and 192.168.55.22/32
using protocol TCP
destination port 22
.
/var/lib/multi-networkpolicy/iptables/
","text":"kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
/var/lib/multi-networkpolicy/iptables/
in kmaster
root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n
A new afe82680-77b4-4bac-ad2b-8be9488402fb
exists
current.iptables
file content in the /var/lib/multi-networkpolicy/iptables/ afe82680-77b4-4bac-ad2b-8be9488402fb
root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
"},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.
kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# docker images\nREPOSITORY TAG IMAGE ID CREATED SIZE\nabcdesktopio/oc.pyos dev 6bd8b8d33b73 19 hours ago 1.17GB\nrancher/mirrored-flannelcni-flannel v0.16.3 8cb5de74f107 3 days ago 59.7MB\nmemcached latest fa6cf68061c2 5 days ago 89.1MB\nk8s.gcr.io/kube-apiserver v1.23.3 f40be0088a83 6 days ago 135MB\nk8s.gcr.io/kube-controller-manager v1.23.3 b07520cd7ab7 6 days ago 125MB\nk8s.gcr.io/kube-scheduler v1.23.3 99a3486be4f2 6 days ago 53.5MB\nk8s.gcr.io/kube-proxy v1.23.3 9b7cc9982109 6 days ago 112MB\nabcdesktopio/oc.user.18.04 latest 52176672cf2e 7 days ago 1.79GB\nabcdesktopio/oc.user.ssh.18.04 dev 52176672cf2e 7 days ago 1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables latest 54838d8bbd14 10 days ago 408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin v1.0.1 ac40ce625740 12 days ago 8.1MB\nabcdesktopio/oc.nginx dev fe71c8621ef2 12 days ago 506MB\nabcdesktopio/oc.pulseaudio.18.04 dev d44997a46969 2 months ago 170MB\nabcdesktopio/oc.pulseaudio.18.04 latest d44997a46969 2 months ago 170MB\nk8s.gcr.io/etcd 3.5.1-0 25f8c7f3da61 3 months ago 293MB\nghcr.io/k8snetworkplumbingwg/multus-cni stable e6cafb5d5aa1 3 months ago 290MB\nk8s.gcr.io/coredns/coredns v1.8.6 a4ca41631cc7 3 months ago 46.8MB\nabcdesktopio/oc.cupsd.18.04 dev 095105a59722 4 months ago 745MB\nabcdesktopio/oc.cupsd.18.04 latest 095105a59722 4 months ago 745MB\nk8s.gcr.io/pause 3.6 6270bb605e12 5 months ago 683kB\nrroemhild/test-openldap latest c6b1bec361ca 10 months ago 144MB\nabcdesktopio/oc.mongo latest 802219537d3b 12 months ago 493MB\nabcdesktopio/oc.speedtest dev 298a391cfb5b 3 years ago 355MB\n
To add an application like Firefox, run the docker pull
command :
root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
"},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"Reload or open your web browser
http://[your-ip-hostname]:30443/\n
Firefox is added to your desktop dock. Start Firefox application
No rule has be defined to allow http request from your pod to a web site
All http requests are denied
The firefox application inherits from the pod's the network rules.
"},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"If you choose to use VMware instead of VirtualBox hypervisor
"},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about themacvlan
driver :","text":"Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.
"},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan
driver on vSwitch VMware","text":"The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.
When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.
Set the Mac address changes option is set to Accept
"},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":"When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.
"},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"On your worker nodes :
abcdesktop=true
to the network objectYou have to choose a nework driver for example
network driver macvlan ipvlan docker-sriov-pluginOnly the name of the network is used by abcdesktop.
Create a network with macvlan
or ipvlan
driver
In these two examples :
192.168.8.0/24
192.168.8.254
192.168.8.0/27
macvlan
:","text":"Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123
docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan
ipvlan_mode=l2 :","text":"Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.
docker network create --label type=oc.app -d ipvlan -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan
or ipvlan
):","text":"Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :
ping
the default gatewaynslookup
to query www.google.com ip addressexport GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
"},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"Update your applist.json
file and add a specific rule into the firefox application description
git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n
Specific rules entry example
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } },\n
In this example, if the current user token contains the tag label internet
when the firefox application use abcnetfirefox
and the dns 8.8.8.8
applist.json
file","text":"Edit the applist.json
file, and add rules to the application firefox
for example
The new firefox dictionary with rules :
{\n \"cat\": \"office\",\n \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n \"ENV NSS_SDB_USE_CACHE=yes\" ],\n \"debpackage\": \"\",\n \"icon\": \"firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.Firefox\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox\",\n \"showinview\": \"dock\",\n \"splash\": \"enable\",\n \"mem_limit\": \"16gb\",\n \"oomkilldisable\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n \"shm_size\": \"2gb\",\n \"usedefaultapplication\": true,\n \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n}\n
Save your changes, and run make dockerfile
, next docker build
Build and update your new firefox application
# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n
Check that the oc.rules
label in new firefox.d image
docker inspect firefox.d \n
The oc.rules
label is a string json formated
\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
"},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"Add a tag internet
to the user auth provider
od.config
file","text":"Update the ldapconfig
for planet with the new policies
dict
'policies': { 'acls': None, \n 'rules' : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ],\n 'expected' : True, \n 'label': 'internet' },\n
The complete ldapconfig
for planet is
ldapconfig : { 'planet': { 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ '192.168.7.69' ],\n 'secure' : False,\n 'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n 'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}', \n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n 'policies': { 'acls': None, \n 'rules' : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'internet' } \n } } } }\n
Restart your kubernetes pyos pod, to reload new the od.config
configuration file.
Philip J. Fry
user context.","text":"Open a web browser, go to the abcdesktop login page.
Login Accounts
Login Password Philip J. Fry. fry Hubert J. Farnsworth professorNote: the user Philip J. Fry
is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Note: the user Hubert J. Farnsworth
is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Login as the Philip J. Fry
user account.
During the user login process, pyos tag the user authentification with the 'label': 'internet'
Start the new application firefox
, the docker network for this application use the abcnetfirefox
Run the command
docker network inspect abcnetfirefox\n
abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\"
and bind the abcnetfirefox
to user container.
[\n {\n \"Name\": \"abcnetfirefox\",\n \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n \"Scope\": \"local\",\n \"Driver\": \"macvlan\",\n \"EnableIPv6\": false,\n \"IPAM\": {\n \"Driver\": \"default\",\n \"Options\": {},\n \"Config\": [\n {\n \"Subnet\": \"192.168.8.0/24\",\n \"Gateway\": \"192.168.8.254\"\n }\n ]\n },\n \"Internal\": false,\n \"Attachable\": false,\n \"Ingress\": false,\n \"ConfigFrom\": {\n \"Network\": \"\"\n },\n \"ConfigOnly\": false,\n \"Containers\": {\n \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n \"MacAddress\": \"02:42:a1:69:d0:82\",\n \"IPv4Address\": \"192.168.8.1/24\",\n \"IPv6Address\": \"\"\n }\n },\n \"Options\": {\n \"parent\": \"eno1.106\"\n },\n \"Labels\": {\n \"type\": \"oc.app\"\n }\n }\n]\n
Close the firefox application.
Logoff, to remove the user pod Philip J. Fry
.
`Hubert J. Farnsworth
user context.","text":"Login as the Hubert J. Farnsworth
user account.
Note: the user Hubert J. Farnsworth
is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Start the new application firefox
, the docker network for this application do NOT use the abcnetfirefox
Run the command
docker network inspect abcnetfirefox\n
abcnetfirefox
description :
docker network inspect abcnetfirefox\n[\n {\n \"Name\": \"abcnetfirefox\",\n \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n \"Scope\": \"local\",\n \"Driver\": \"macvlan\",\n \"EnableIPv6\": false,\n \"IPAM\": {\n \"Driver\": \"default\",\n \"Options\": {},\n \"Config\": [\n {\n \"Subnet\": \"192.168.8.0/24\",\n \"Gateway\": \"192.168.8.254\"\n }\n ]\n },\n \"Internal\": false,\n \"Attachable\": false,\n \"Ingress\": false,\n \"ConfigFrom\": {\n \"Network\": \"\"\n },\n \"ConfigOnly\": false,\n \"Containers\": {},\n \"Options\": {\n \"parent\": \"eno1.106\"\n },\n \"Labels\": {\n \"type\": \"oc.app\"\n }\n }\n]\n
The new firefox container doesn't use the docker network abcnetfirefox
, because the Hubert J. Farnsworth
user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
The network is disabled by default.
Inspect the Hubert J. Farnsworth
firefox container
\"NetworkSettings\": {\n \"Bridge\": \"\",\n \"SandboxID\": \"\",\n \"HairpinMode\": false,\n \"LinkLocalIPv6Address\": \"\",\n \"LinkLocalIPv6PrefixLen\": 0,\n \"Ports\": {},\n \"SandboxKey\": \"\",\n \"SecondaryIPAddresses\": null,\n \"SecondaryIPv6Addresses\": null,\n \"EndpointID\": \"\",\n \"Gateway\": \"\",\n \"GlobalIPv6Address\": \"\",\n \"GlobalIPv6PrefixLen\": 0,\n \"IPAddress\": \"\",\n \"IPPrefixLen\": 0,\n \"IPv6Gateway\": \"\",\n \"MacAddress\": \"\",\n \"Networks\": {}\n }\n
The network access is disable for this application
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n
In this case, only users with the label tag internet
, can bind the network name abcnetfirefox
.
Hubert J. Farnsworth
","text":"Update the application firefox rules
Now it's time to permit network access to
Update the applist.json file :
Specific rules entry example
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": true, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } },\n
The new firefox dictionary with network rules set with \"default\": true :
{\n \"cat\": \"office\",\n \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n \"ENV NSS_SDB_USE_CACHE=yes\" ],\n \"debpackage\": \"\",\n \"icon\": \"firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.Firefox\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox\",\n \"showinview\": \"dock\",\n \"splash\": \"enable\",\n \"mem_limit\": \"16gb\",\n \"oomkilldisable\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n \"shm_size\": \"2gb\",\n \"usedefaultapplication\": true,\n \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": true, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n}\n
Save your changes, and run make dockerfile
, next docker build
Build and update your new firefox application
# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n
Check that the oc.rules
label in new firefox.d image
docker inspect firefox.d \n
The oc.rules
label is a string json formated
\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n
Request the abcdesktop core service to update the application cache data
Replace MY_FQDN by your own hostname
export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n
You do not need to logoff the Hubert J. Farnsworth
, just close Firefox application and start it again. The new firefox container use the default network.
Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
use the abcnetfirefox
network.
create
and destroy
application","text":"A rule support a specific bash command to notify external security equipment like firewalls, by sending create
and destroy
events.
\"rules\": { \"homedir\": { \"default\": false, \"ship\": true }, \n \"network\": { \"default\": false, \n \"ship\": { \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ], \n \"webhook\": { \n \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n } \n }\n }\n}\n
pyos
execute the command /usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
pyos
call the url /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n
Each {{ $label }}
is a mustached value.
Philip J. Fry
sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev
launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"The control plane pyos
replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}'
as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'
The control plane pyos
replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}'
as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'
To encode url parameters use the option desktop.webhookencodeparams
. Set desktop.webhookencodeparams
to True
to encode label name. The default value is False
Additional datas can be set using the desktop.webhookdict
option in od.config file
desktop.webhookdict: { \n 'api_key': 'supersecret', \n 'firewall_manage_ip': '161.105.208.129' \n}\n
The command line
/usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n
becomes
/usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
"},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":"Build image process from abcdesktopio docker registry to your private registry
"},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"Goal :
Only the name of the network is used by abcdesktop.
"},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"git clone https://github.com/abcdesktopio/webModules.git\n
"},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"Update your ui.json
file. ui.json
is located in var/webModules/transpile/config
directory.
# cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x 1 root root 4096 Feb 1 15:14 .\ndrwxr-xr-x 1 root root 4096 Feb 1 15:14 ..\n-rw-rw-r-- 1 root root 34 Feb 1 15:14 .cache.json\n-rw-rw-r-- 1 root root 2215 Feb 1 15:11 modules.json\n-rw-rw-r-- 1 root root 1044 Feb 1 15:11 ui.json\n
ui.json
is a json dictionary file
The main entry is name
, name is the project name:
{\n \"name\": \"abcdesktop.io\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#6EC6F0\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile
to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"Change for example the name to
\"name\": \"acmedesktop.io\"\n
and the
@tertiary \"value\": \"#00BCD4\"\n
Example
{\n \"name\": \"acmedesktop.io\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#00FCD4\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
"},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"Run the docker build command to build the new oc.nginx:acme
image
docker build -t oc.nginx:acme .\n
Sending build context to Docker daemon 258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n
Run the docker images
command to read the new oc.nginx
image
docker images \n\nREPOSITORY TAG IMAGE ID CREATED SIZE\noc.nginx acme 4de1755b60d7 About an hour ago 746MB\n
"},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx
by the new image oc.nginx:acme
name.
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'oc.nginx:acme'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
The run the docker-compose up, and start you web browser. You can read the new project name at the home page.
We define the new tertiary color as #00FCD4
in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }
Old tertiary color has been replace by #00FCD4
.
"},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":"
envsubst
command preinstalled. Common Linux systems have envsubst
preinstalledroot
. Run xedit application as root
hermes
. Run xedit application as hermes
We are starting a new containerised application from a fresh ubuntu:20.04
image and bind the X11 socket to use the pod DISPLAY.
We start a new container one as root
, and another one as current user hermes
Open a web browser and go to abcdesktop service url
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"In the example we use LDAP authentification.
The login
is Hermes Conrad
, the password is hermes
Get a shell to your host. All next command use a host shell.
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's podname
","text":"To read the hermes pod name
, MIT-MAGIC-COOKIE-1
, and uid
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n
We save this value in the pod
variable, for next usage
POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n
You should read on stdout
hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n
We save this value in the $POD
for a next usage.
XAUTH_KEY
","text":"The release 3.0 need the MIT-MAGIC-COOKIE-1
to reach the x11 DISPLAY
.
Run the command echo $XAUTH_KEY
to read the $XAUTH_KEY
value inside the hermes's pod
export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n
The XAUTH_KEY
variable is exported for a next usage.
echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid
","text":"kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n
We save this value in the PODUID
exported variable, for next usage
export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding
volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID
","text":"The default kubelet's pod directory is /var/lib/kubelet/pods/
. If you change it during the installation process replace /var/lib/kubelet/pods/
by your own directory.
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root 60 Dec 8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec 8 19:43 ..\nsrwxrwxrwx 1 1051 2051 0 Dec 8 19:43 X0\n
X0
is a file unix socket, we will bind the X0
socket in the next podapp.
home-hermes
volume location","text":"kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n
Description of this query
We save this value in the PODHOME
exported variable, for next usage
export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n
Check the value with a echo
echo $PODHOME\n/tmp/hermes-conrad\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04
","text":"Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume
/var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket:/tmp/.X11-unix
homedir
$PODHOME:/home/balloon
We use envsubst
to replace variable content in a template yaml file.
Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:
brew install gettext
The variables ${PODUID}
, ${PODHOME}
and ${XAUTH_KEY}
are exported.
Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst
Create a file podapp.template.yaml
apiVersion: v1\nkind: Pod\nmetadata:\n name: podapp\n namespace: abcdesktop\nspec:\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host ${PODUID}\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: ${PODHOME}\n # this field is optional\n type: Directory\n containers:\n - name: abccontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n env:\n - name: XAUTH_KEY\n value: ${XAUTH_KEY}\n
Run the envsubst
command to replace ${PODUID}
, ${PODHOME}
and ${XAUTH_KEY}
envsubst < podapp.template.yaml > podapp.yaml \n
Dump the podapp.yaml
file content, and check that the volumes are set with the new values.
# cat podapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n name: podapp\n namespace: abcdesktop\nspec:\n volumes:\n - name: x11socket\n hostPath:\n # directory location on host\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # directory location on host\n path: /tmp/hermes-conrad\n # this field is optional\n type: Directory\n containers:\n - name: abccontainer\n image: ubuntu:20.04\n command: /bin/sleep 1d\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n
Create the application pod
kubectl apply -f podapp.yaml \npod/podapp created\n
Check that your pod podapp
is Running
kubectl get pods podapp -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npodapp 1/1 Running 0 32s\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp
","text":"You get a shell command inside the container.
kubectl exec -it podapp -n abcdesktop -- bash \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"apt-get update && apt-get install -y xauth\n
export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n
You can read on stdout
root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth: file /root/.Xauthority does not exist\nroot@podapp:/#\n
The file /root/.Xauthority
does not exist, it has been created.
For example, I choose to install the x11-apps
package
Replace x11-apps
by your own application
apt-get install -y x11-apps\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"To start the X11 application, just run it. Your DISPLAY
is set to :0.0
, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1
).
But remember you a running a container as root
, and all commands are running as root
inside the container.
Start xedit
xedit\n
Go back to your web browser.
A new x11 window xedit
should be present on your display
xedit
doesn't write any error message in the bash container.
You've get a shell inside a container to run and start any application. You can also install and start any others applications.
To clean the running pod podapp
kubectl delete pods podapp -n abcdesktop \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04
as hermes
","text":"To start a new container from ubuntu:20.04
as hermes
, we have to add the localaccount
secret volume to the previous container
Read the securityContext from the hermes
pod
export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n
Check the uidNumber
and the gidNumber
values
echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n
Create a file hermespodapp.template.yaml
apiVersion: v1\nkind: Pod\nmetadata:\n name: hermespodapp\n namespace: abcdesktop\nspec:\n securityContext:\n runAsUser: ${PODRUNASUSER}\n runAsGroup: ${PODRUNASGROUP}\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host ${PODUID}\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: ${PODHOME}\n # this field is optional\n type: Directory\n - name: localaccount\n hostPath:\n # localaccount directory location on host\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n # this field is optional\n type: Directory\n containers:\n - name: hermescontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n - mountPath: /var/secrets/abcdesktop/localaccount\n name: localaccount\n env:\n - name: XAUTH_KEY\n value: ${XAUTH_KEY}\n
Create your hermespodapp.yaml file from the previous template
envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n
Look at your hermespodapp.yaml
cat hermespodapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n name: hermespodapp\n namespace: abcdesktop\nspec:\n securityContext:\n runAsUser: 1051\n runAsGroup: 2051\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: /tmp/hermes-conrad\n # this field is optional\n type: Directory\n - name: localaccount\n hostPath:\n # localaccount directory location on host\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n # this field is optional\n type: Directory\n containers:\n - name: hermescontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n - mountPath: /var/secrets/abcdesktop/localaccount\n name: localaccount\n env:\n - name: XAUTH_KEY\n value: 306908f8e4d4768c7595ce5ad53479\n
Create the hermespodapp
kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n
To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc
to get a rooted shell.
Read the containerID
of the pod hermespodapp
CONTAINER=$(kubectl -n abcdesktop get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n
Get the shell with runc
command
runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n
This is correct group ID 2051
does not exit. Let's patch your file system with hermes
credentials
rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n
Now your files are updated. You can exit, and reopen a bash to your container
root@hermespodapp:/# exit\n
# runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n
The error message does not appear anymore.
Install your X11 applications as root
apt-get update && apt-get install -y x11-apps\n
Quit the root session
exit\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes
","text":"Start a new session to the pod hermespodapp
kubectl -n abcdesktop exec -it hermespodapp -- bash \n
You get a shell prompt as as hermes
. Check the hermes
homedirectory and id number
hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n
Export the var DISPLAY
and start the edit application. You don't need to create the .Xauthority
file. /home/hermes
is already mounted as a volume.
hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n
This process is running as hermes
:
hermes@hermespodapp:~$ ps -ef\nUID PID PPID C STIME TTY TIME CMD\nhermes 1 0 0 15:57 ? 00:00:00 /bin/sleep 1d\nhermes 690 0 0 16:47 pts/0 00:00:00 bash\nhermes 699 690 0 16:48 pts/0 00:00:00 xedit\nhermes 700 690 0 16:49 pts/0 00:00:00 ps -ef\n
Go back to your web browser.
A new x11 window xedit
should be present on your display
The name of the edit window is the name of your pod (hermespodapp)
.
To clean the running pod hermespodapp
kubectl delete -f hermespodapp.yaml \n
You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.
"},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"Only supported in abcdesktop release 3.0
An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.
You must have your own NFS server running with the share exported before you can use it.
"},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update theod.config
file","text":"Update the od.config
to add
auth provider
","text":"In this example, we add a label nfsuser
as a condition to mount nfs resource
In the auth provider add a dummy
condition or a memberOf
condition. All types of conditions are supported, the goal is only to get a label.
Update the od.config
file and look for the default ldapconfig
dictionnary
ldapconfig : { \n 'planet': { \n 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'dc=planetexpress,dc=com',\n 'users_ou' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': { \n 'acls': None, \n 'rules' : { \n 'rule-dummy': { \n 'conditions' : [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'nfsuser' } } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf
condition","text":"ldapconfig : { \n 'planet': { \n 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'dc=planetexpress,dc=com',\n 'users_ou' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': { \n 'acls': None, \n 'rules' : { \n 'rule-nfsuser': { \n 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ],\n 'expected' : True, \n 'label': 'nfsuser' } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule
in the desktop.policies
","text":"In this example, we define entries :
nfsserver
is 192.168.7.101
(can also be a FQDH)path
is /volume1/isostore
mountPath
is /mnt/iso
The mount command become like:
mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n
Update the desktop.policies
dictionnary and add a new key rules
. In the new rules
define a new entry nfsuser
.
The name of the entry MUST match a user label tag, else the mount point is not created.
In this example the label is defined as nfsuser
, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume
desktop.policies: { \n'acls' : {},\n'rules': { \n 'volumes': { \n 'nfsuser': {\n 'type': 'nfs', \n 'name': 'isostore', \n 'server': '192.168.7.101',\n 'path': '/volume1/isostore',\n 'mountPath': '/mnt/iso',\n 'readOnly': True } } } } \n
"},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config
file","text":"Save your local changes in od.config
, and update the new configmap abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
"},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos
","text":"Restart pyos
pods
kubectl delete pod -l run=pyos-od -n abcdesktop\n
pod \"pyos-od-5586b88767-64jwt\" deleted\n
"},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad
and list nfs files","text":"Open the url http://localhost:30443
, in your web browser, to start a simple user's pod.
http://localhost:30443\n
Hermes Conrad
for example. Hermes Conrad
is member of admin_staff
. nfsuser
is listed/mnt/iso
directory contentYou can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section
"},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"Let talk about a common features with multiple groups and user securityContext
on pods
ou=people,dc=planetexpress,dc=com
gidNumber
and uidNumber
supplementalGroups
supportkubernetes
supplementalGroups
support","text":"Let's create a yaml file to define pod with securityContext
and supplementalGroups
apiVersion: v1\nkind: Pod\nmetadata:\n name: security-context-supplementalgroups-demo\nspec:\n securityContext:\n runAsUser: 1000\n runAsGroup: 3000\n supplementalGroups: [2000,4000,5000,6000]\n volumes:\n - name: sec-ctx-vol\n emptyDir: {}\n containers:\n - name: sec-ctx-demo\n image: busybox:1.28\n command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n volumeMounts:\n - name: sec-ctx-vol\n mountPath: /data/demo\n securityContext:\n allowPrivilegeEscalation: false\n
Create the pod security-context-supplementalgroups-demo
$ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n
The pod is created
pod/security-context-supplementalgroups-demo created\n
Test the id
command, you get the list uid=1000
gid=3000
groups=2000,4000,5000,6000
$ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n
Run the group command inside the pod
$ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n
The result exit
with code 1
. The groups do not exist in /etc/group
3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n
This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid
, gid
and supplementalgroups
are read from posixAccount
and posixGroup
in the directory service.
.spec.securityContext
from a pod","text":"kubectl command to read .spec.securityContext
kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n
You read as output
{\n \"runAsGroup\": 3000,\n \"runAsUser\": 1000,\n \"supplementalGroups\": [\n 2000,\n 4000,\n 5000,\n 6000\n ]\n}\n
"},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"The complete ldif file can be downloaded at the end of this page.
The ldif set :
people
: ou=people,dc=planetexpress,dc=com
groups
: ou=groups,dc=planetexpress,dc=com
Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com
- gidNumber: 1036
- uid: hermes
- uidNumber: 1035
Create a posixGroup for hermes
: cn=hermes,ou=groups,dc=planetexpress,dc=com
posixGroup
top
hermes
1036
Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com
accountant
18430
hermes
Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com
20467
fry
hermes
Login to abcdesktop as Hermes Conrad
account
Inside the user pod, the unix group file contains :
cat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n
This is correct.
The user's pod is defined with a securityContext
In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27
by your own pod's name
kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext' \n
You can read on stdout
{\n \"runAsGroup\": 1036,\n \"runAsUser\": 1035,\n \"supplementalGroups\": [\n 20467,\n 18430\n ]\n}\n
This is correct. supplementalGroups
defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com
Inside the user pod run the id
command
hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n
This is correct.
"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"The default home directory in od.config
is a volume hostPath
set to /tmp
desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n
On your host server, get a shell with as root account, create a file humansfile
with restricted access to member of humans
group.
cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n
Check the owner and group of the new file humansfile
ls -la humansfile\n----rwx--- 1 root 20467 6 nov. 23 17:16 humansfile\n
Check inside the user pod check that hermes
account can write data in the new file humansfile
.
This is correct hermes
is member of humans
group.
hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n
This is correct.
The user's pod is defined with a securityContext
'securityContext': {\n 'runAsUser': 1035,\n 'runAsGroup': 1036,\n 'supplementalGroups': [20467, 18430] \n}\n
This is correct. supplementalGroups
defines the others groups from LDAP
Inside the user pod run the id
command
hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n
This is correct.
"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"The default home directory in od.config
is a volume hostPath
set to /tmp
desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n
On your host server, using a root account, create a file humansfile
with restricted access to member of humans
group.
cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n
Check the owner and group
ls -la humansfile\n----rwx--- 1 root 20467 6 nov. 23 17:16 humansfile\n
Check inside the user pod check that hermes
account can to write data in file humansfile
, because hermes
is member of humans
group.
hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n
This is correct.
We describe a common features with multiple groups and user securityContext
on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.
To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.
version: 1\n=======\nhermes:~$ \n
This is correct.
We describe a common features with multiple groups and user securityContext
on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.
To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.
version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
"},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":""},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":"docker
package installed Download the ui.json
file. ui.json
is located in webModules/transpile/config
directory of webModules
abcdesktop's repository.
mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n
ui.json
is a json dictionary file
The main entres are :
name
, name is the name of your project.projectNameSplitedHTML
, is the animated span
name of your project.<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>
<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
{\n \"name\": \"abcdesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#6EC6F0\"\n },\n {\n \"name\": \"@quaternary\",\n \"value\": \"#1E1E1E\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\",\n \"urlusermanual\": \"https://www.abcdesktop.io/\",\n \"urlusersupport\": \"https://www.abcdesktop.io/\",\n \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"Change for example the name
of the project, and projectNameSplitedHTML
to
\"name\": \"acmedesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n
Example
{\n \"name\": \"acmedesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#18974C\"\n },\n {\n \"name\": \"@quaternary\",\n \"value\": \"#1E1E1E\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\",\n \"urlusermanual\": \"https://www.abcdesktop.io/\",\n \"urlusersupport\": \"https://www.abcdesktop.io/\",\n \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile
to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile
to build the new image","text":"Dockerfile
#\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
"},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"Run the docker build command to build the new oc.nginx:acme
image
docker build -t oc.nginx:acme .\n
# docker build -t oc.nginx:acme .\nSending build context to Docker daemon 21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.0 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.0\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.0\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\" maintainer=\"acmedesktop\" version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n
Run the docker images
command to read the new oc.nginx
image
docker images \n\nREPOSITORY TAG IMAGE ID CREATED SIZE\noc.nginx acme b5449d85393f 2 minutes ago 685MB\n
"},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"docker image save oc.nginx:acme -o oc.nginx.acme\n
"},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme
in k8s.io
namespace for containerd
","text":"The oc.nginx.acme
not is listed in the k8s.io
namespace.
Run the ctr
command line to import oc.nginx.acme
ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n
Check that your new image is listed
ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme application/vnd.docker.distribution.manifest.v2+json sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64 io.cri-containerd.image=managed \n
"},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"Update your own abcdesktop.yaml
file to replace the default image abcdesktopio/oc.nginx:3.0
by the new container image oc.nginx:acme
name.
containers:\n - name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.2\n
Replace :
imagePullPolicy: Always
by imagePullPolicy: Never
image: abcdesktopio/oc.nginx:3.2
by image: oc.nginx:acme
containers:\n - name: nginx\n imagePullPolicy: Never\n image: oc.nginx:acme\n
Apply the new abcdesktop.yaml
file
kubectl apply -f abcdesktop.yaml \n
The deployment.apps/nginx-od
is configured
clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n
kubectl delete pod -l run=nginx-od -n abcdesktop\n
Start you web browser. You can read the new project name at the home page.
The new login animation paints acme
desktop
You have updated the html web page for abcdesktop release 3.0
"},{"location":"core/memcached/","title":"Memcached","text":"The memcached container comes from the public docker registry. This service is attend to the netback network.
memcached store pods and containers message during the create process.
"},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"Messages stored into memcache
status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.
The mongodb container comes from the public docker registry. This service is attend to the netback network.
"},{"location":"core/mongodb/#collections","title":"Collections","text":"abcdesktop.io uses the colections mongodb to store
[ \n \"keyboard\",\n \"frontendjs.filemanager\",\n \"Mail.Thunderbird\",\n \"libreoffice.libreoffice-calc\",\n \"libreoffice.libreoffice-writer\",\n \"Navigator.Firefox\",\n \"gimp.Gimp\",\n \"gnome-terminal.Gnome-terminal\"\n]\n
"},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"The object's format is :
{\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
The method getCollection, is a ligth way to get a collection on the fron-end side.
For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.
getCollection('loginHistory', function(msg) {\n if (msg.status === 200) {\n var history = msg.result;\n loginHistory = history;\n buildHtmlTable(history);\n }\n })\n
"},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).
"},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":"The static files (html, css, js) are stored in the local /var/webModules directory.
"},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":"http://$my_proxy:$api_service_tcp_port;
http://$target:$spawner_service_tcp_port;
http://$target:$ws_tcp_bridge_tcp_port/;
http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;
http://$target:$broadcast_tcp_port;
The /etc/nginx/get.targetmap.lua read the jwt_token
and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key
and the jwt_desktop_payload_private_key
It uses a targetmap (dict) as first cache level.
lua_shared_dict targetmap 1m;\n
Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.
"},{"location":"core/ocuser/","title":"The POD User","text":"After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.
"},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"The pod user runs by default a container with the graphical image : the oc.user.18.04.
A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage
and desktop.printerimage
].
All processes are running as the user named balloon
, because none of theme need to run as root
.
The userid and the guid are 4096
.
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n
Supervisor is the parent of all running process
docker-entrypoi---supervisord-+-Xvnc\n |-node---10*[{node}]\n |-4*[nodejs---10*[{nodejs}]]\n |-nodejs---6*[{nodejs}]\n |-nodejs-+-bash---pstree\n | `-11*[{nodejs}]\n |-openbox\n `-xsettingsd\n
"},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"TigerVNC is a high-performance, platform-neutral implementation of VNC
(Virtual Network Computing
), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.
Starts parameters
command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n
The default DISPLAY is :0. Xvnc
listen on unix socket file /tmp/.x11vnc
.
Openbox is the window manager, it supports extensive standards support.
Openbox is patched with few line to send SIG_USR1
and SIG_USR2
messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.
This patch add notification when X11/window change :
The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)
#define SIG_MANAGED_WINDOW SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n
Openbox is started by supervisord using the command :
command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
"},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.
ws-tcp-bridge is started by supervisord using the command :
/composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
"},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :
spawner-service.js is started by supervisord using the command :
command=nodejs /composer/node/spawner-service/spawner-service.js\n
"},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :
command=nodejs /composer/node/printer-service/printer-service.js\n
"},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"Broadcast-service.js allows to broadcast messages between all user sharing the same session.
Broadcast-service.js is started by supervisord using the command :
command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
"},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.
http.createServer(function(req, res) {\n if (req.method === 'POST') {\n uploadFile( req, res );\n } \n else if (req.method === 'GET') {\n respondFile( req, res );\n }\n}).listen(8080, function() {\n console.log('Listening for requests');\n});\n
File-service.js is started by supervisord using the command :
command=nodejs /composer/node/file-service/file-service.js\n
"},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.
file etc/pulse/default.pa
load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n
Pulseaudio is started by supervisord using the command :
command=/usr/bin/pulseaudio\n
"},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:
Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n
Xsettingsd is started by supervisord using the command.
command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
"},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.
+-------------------+\n| oc.user.18.04 | (abcdesktop.io custom software component)\n+---------+---------+\n |\n+---------+---------+\n| oc.software.18.04 | (abcdesktop.io ubuntu software component)\n+---------+---------+\n |\n+---------+---------+\n| oc.ubuntu.18.04 | (abcdesktop.io ubuntu service)\n+-------------------+\n |\n+---------+---------+\n| ubuntu:18.04 | (official ubuntu images from dockerhub)\n+-------------------+\n
To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.
docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04 -f oc.user.18.04 .\n
To do it automaticly, clone composer/dockerbuild and run the Makefile
git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
"},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:
oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:
oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:
"},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"# Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install \nRUN cd /composer/node/file-service && npm install\nRUN cd /composer/node/printer-service && npm install\nRUN cd /composer/node/spawner-service && npm install \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
"},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"# change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN chown -R $BUSER:$BUSER /var/spool/cups && \\\n chown -R $BUSER:$BUSER /var/spool/cups-pdf && \\\n chown -R $BUSER:$BUSER /var/log/cups && \\\n chown -R $BUSER:$BUSER /var/cache/cups && \\\n chown -R $BUSER:$BUSER /etc/cups/printers.conf && \\\n chown -R $BUSER:$BUSER /var/run/cups/\n
"},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"Datas to these tcp ports are routed by nginx
PULSEAUDIO_HTTP_PORT 4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT 6081\nRESERVED_FOR_NEXT_VERSION 29780\nXTERM_TCP_PORT 29781\nFILE_SERVICE_TCP_PORT 29783\nBROADCAST_SERVICE_TCP_PORT 29784\nRESERVED FOR CUPSD 29785\nSPAWNER_SERVICE_TCP_PORT 29786\n
"},{"location":"core/pyos/","title":"pyos","text":"oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :
The speedtest container comes from the public docker registry.
"},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.
"},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
A sample API
Base URLs:
GET /
Get file from the home directory
Example responses
403 Response
"},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"Status Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"POST /
Upload a file at a given path
Body parameter
Example responses
200 Response
"},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"DELETE /
Remove a given file wich is present in home directory
Body parameter
{\n \"myFilename\": \"string\"\n}\n
"},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none Example responses
200 Response
"},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 400
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"GET /directory/list
List files in a given directory
"},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
A sample API
Base URLs:
GET /version
Get User container version
Example responses
200 Response
{\n \"date\": null,\n \"commit\": \"string\",\n \"version\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"POST /launch
Used to run builtin application process
Body parameter
{\n \"command\": \"string\",\n \"args\": [\n \"string\"\n ]\n}\n
"},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"POST /setAudioQuality
Set the audio quality
Body parameter
{\n \"sink\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"POST /playAudioSample
Play a sample audio
Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"PUT /configurePulse
Configure pulse audio for Janus
Body parameter
{\n \"destinationIp\": \"string\",\n \"port\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"POST /broadcastwindowslist
Emit a broadcast with window list as data
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"POST /clipboardsync
Synchronize X11 and gtk clipboard
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"POST /setDesktop
Store a data as json file in desktop
Body parameter
{\n \"key\": \"string\",\n \"value\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"GET /getDesktop
Get a data stored as json file
"},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true noneExample responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"GET /getmimeforfile
Get a mime for a given filename
"},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true noneExample responses
200 Response
{\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"GET /filesearch
Used for list files by dock
"},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true noneExample responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"file\": \"string\",\n \"mime\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"POST /generateDesktopFiles
Build desktop files to run containerized applications
Body parameter
{\n \"list\": [\n {\n \"mimetype\": \"string\",\n \"path\": \"string\",\n \"executablefilename\": \"string\",\n \"icon\": \"string\",\n \"name\": \"string\",\n \"launch\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"GET /getappforfile
Allow to get the app necessary
Example responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"command\": \"string\",\n \"args\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"GET /about
Get system informations
Example responses
200 Response
{\n \"hostname\": \"string\",\n \"ipaddr\": \"string\",\n \"plateform\": \"string\",\n \"arch\": \"string\",\n \"release\": \"string\",\n \"cpu\": \"string\",\n \"clientipaddr\": \"string\",\n \"country\": \"string\",\n \"language\": \"string\",\n \"build\": \"string\",\n \"POD_NAMESPACE\": \"string\",\n \"POD_NAME\": \"string\",\n \"NODE_NAME\": \"string\",\n \"POD_IP\": \"string\",\n \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"GET /getSettings
Get configuration for settings window
Example responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"tab\": \"string\",\n \"enabled\": true\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"POST /setBackgroundColor
Change the background color
Body parameter
{\n \"color\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"POST /setBackgroundImage
Set the background image
Body parameter
{\n \"imgName\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {\n \"color\": \"string\",\n \"subData\": {\n \"code\": 0,\n \"data\": \"string\"\n }\n }\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"POST /setDefaultImage
Set the default image as background
Example responses
200 Response
"},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"GET /getwindowslist
Get window list
Example responses
200 Response
"},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"POST /activatewindows
Activate windows
Body parameter
{\n \"windowsid\": [\n 0\n ]\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"POST /closewindows
Close windows
Body parameter
{\n \"windowsid\": [\n 0\n ]\n}\n
"},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"POST /placeAllWindows
Place and resize all windows
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"{\n \"code\": 0,\n \"data\": \"string\"\n}\n\n
"},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"{\n \"code\": 0,\n \"data\": \"string\"\n}\n\n
All operations completed with success
"},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"{\n \"code\": 0,\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"{\n \"code\": 0,\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"{\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"{\n \"code\": 0,\n \"data\": [\n {\n \"command\": \"string\",\n \"args\": \"string\"\n }\n ]\n}\n\n
"},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.
abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io
This article is just an update from Fabian St\u00e4ber work.
"},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.
Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.
"},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
.
The plugin directory can be configured with the kubelet's --volume-plugin-dir
parameter, run ps aux | grep kubelet
to learn the location of the plugin directory on your system (see [#1][9]). The cifs
script must be located in a subdirectory named abcdesktop~cifs/
. The directory name abcdesktop~cifs/
will be mapped to the Flexvolume driver name abcdesktop/cifs
.
On the Kubernetes master and on each Kubernetes node run the following commands:
VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n
The cifs
script requires a few executables to be available on each host system:
mount.cifs
, on Ubuntu this is in the cifs-utils package.jq
, on Ubuntu this is in the jq package.mountpoint
, on Ubuntu this is in the util-linux package.base64
, on Ubuntu this is in the coreutils package.apt-get install cifs-utils jq util-linux coreutils\n\n
To check if the installation was successful, run the following command:
VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n
It should output a JSON string containing \"status\": \"Success\"
. This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.
In this example, we use a Microsoft Active Directory as a LDAP Server.
CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode
Add a new policy to add a label TAG
during the user's authentification process.
\n# Add an explicit authmanagers\nauthmanagers: { \n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'policies' : { 'acls': None,\n 'rules' : { 'rule-domainuser' : {\n 'conditions' : [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label' : 'domainuser' } \n} } } } } } }\n\n
In this example :
DOMAIN USER
group, we check that the user's primaryGroupID
is equal to 513
primaryGroupID
is equal to 513
the authentification process add the label domainuser
Then in the same od.config file, add rules to the desktop object to match this label domainuser
desktop.policies: { 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n 'acls' : {} }\n\n
In this example :
domainuser
, then the user attribut homeDir
is mounted to the homeDirectory
by the CIFS flexvolume plugin.kubectl apply -f abcdesktop.yml\n
Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.
Run authentification on the Microsoft Active Direcotry Service or on your Samba server
Start the File Manager application. In this example, the homeDir
is set to U:
, the mount entry become the letter U
.
Click on the homeDir
to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex
contains a file ```NAS-file.ods'
Logs files are stored in host directory /var/log/abcdesktop/cifs
# ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c. 1 12:00 ..\n-rw-r--r-- 1 root root 288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root 832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c. 1 14:25 error.alex.json\n-rw-r--r-- 1 root root 834 d\u00e9c. 1 14:25 error.alex.log\n-rw-r--r-- 1 root root 50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root 44 d\u00e9c. 22 12:20 umount.counter\n
Check the file sAMAccountName.log, cifs.log
If there is an error, look at the error.$sAMAccountName.json
and error.$sAMAccountName.log
Example
-rw-r--r-- 1 root root 1264 d\u00e9c. 1 14:25 error.alex.json\n-rw-r--r-- 1 root root 834 d\u00e9c. 1 14:25 error.alex.log\n
Run mount command
mount
In this example :
192.168.7.101
is the IP Address of the NAS server//192.168.7.101/alex
is the shared ressourcealex
is the sAMAccountName# mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n
Check that the kubernetes secrets exist
kubectl get secrets -n abcdesktop\nNAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 65d\nabcdesktopjwtdesktopsigning Opaque 2 65d\nabcdesktopjwtusersigning Opaque 2 65d\nauth-cifs-alex-flexvol-cifs-homedir abcdesktop/cifs 4 10m\nauth-ldif-alex abcdesktop/ldif 11 10m\n
"},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"File need to be written
"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.
abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.
This flexible working environment simplifies usage like
You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.
To reach the demo website, follow the link https://demo.abcdesktop.io
"},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.
"},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"You can watch the youtube video sample. This video describes the Quick installation process.
Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
"},{"location":"#adopters","title":"Adopters","text":"Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!
Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":"abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:
To fully use copy and paste
features, from your local device to your abcdesktop (and vice versa), choose Chrome
, Chromium or Microsoft Edge Chromium. The copy and paste
feature is also supported on Firefox with a dedicated abcdesktop extension.
abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.
"},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.
"},{"location":"adopters/","title":"Adopters","text":"Here are some of the organizations we know are using abcdesktop.io.
Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applicationsIf you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request to add entry in this list.
"},{"location":"applicationsformat/","title":"Application image format","text":"abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.
"},{"location":"applicationsformat/#requirements","title":"Requirements","text":"Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.
LABEL oc.type=app\n
"},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon
string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata
string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword
string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile
string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat
string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
office oc.launch
string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template
string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path
string Path to the application binary /usr/bin/firefox oc.args
string arguments added to the command --open oc.name
string Name of the application Firefox oc.displayname
string Display Name show by Web interface Firefox oc.type
string Always set to the value 'app' app oc.mimetype
string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview
string Set to the dock to add this app in dock dock oc.fileextensions
string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions
string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config
dict dictionary of resources (see resources details) { 'shm_size': '1g' } Example for Firefox application
LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
"},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
Read the dedicated chapter for resource description, to get more informations on host_config
"},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"To download an abcdesktop docker image, run the command
docker pull abcdesktopio/firefox.d\n
To inspect the labels in the docker image, run docker inspect
docker inspect abcdesktopio/firefox.d:latest\n
Read the labels section :
\"Labels\": {\n \"architecture\": \"x86_64\",\n \"oc.cat\": \"office\",\n \"oc.desktopfile\": \"firefox.desktop\",\n \"oc.displayname\": \"Firefox\",\n \"oc.fileextensions\": \"htm;html;xml;gif\",\n \"oc.icon\": \"firefox.svg\",\n \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n \"oc.keyword\": \"firefox,mozilla,web,internet\",\n \"oc.launch\": \"Navigator.Firefox\",\n \"oc.legacyfileextensions\": \"htm;html;xml\",\n \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"oc.name\": \"Firefox\",\n \"oc.path\": \"/usr/bin/firefox\",\n \"oc.showinview\": \"dock\",\n \"oc.template\": \"oc.template.gtk.firefox\",\n \"oc.type\": \"app\",\n \"oc.usedefaultapplication\": \"true\",\n \"release\": \"5\",\n \"vcs-ref\": \"master\",\n \"vcs-type\": \"git\",\n \"version\": \"1.2\"\n }\n
"},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"All abcdesktop applications use by default the oc.template.gtk images name.
"},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"By default, oc.templace.gtk
is the main image for all applications. For example oc.template.gtk.firefox
use the oc.template.gtk
image. oc.template.gtk.firefox.acme
use the oc.template.gtk.firefox
.
oc.template.gtk.firefox
contains the Mozilla Firefox application.oc.template.gtk.firefox.acme
may contain custom set for Mozilla Firefox application, like Root CA, proxy values or policy.json files for the acme.+------------------------------+\n|oc.template.gtk.firefox.acme |\n+---------------+--------------+\n |\n |\n+---------------+--------------+\n|oc.template.gtk.firefox |\n+---------------+--------------+\n |\n |\n+---------------+--------------+\n|oc.template.gtk |\n+---------------+--------------+\n
"},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"Run, the user is connected to his own POD (or container)
The service infrastructure is based on :
The user creates a pod user
"},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"pyos
is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :
When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.
"},{"location":"architecture/#nginx","title":"nginx","text":"nginx
container act as web server and websocket reverse proxy.
mongo
is used by pyos to store user profil informations. The profil informations are :
memcache
stores progress text message information during login process. memcache
datas are set and get only by the control plane.
oc.user
is the name of the user's container image. oc.user
runs the X11 graphical service. oc.user
is based on ubuntu distribution.
abcdesktopio/oc.user.ubuntu:3.0
is based on ubuntu
distribution 22.04
. Get more details about oc.user image.All applications are containers or pods, and share a graphical socket with the user's container
"},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"abcdesktop can run Microsoft Windows applications using Wine.
"},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded inoc.template.gtk.wine
image","text":"To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.
Start pulling this template image, if you don't have already done in the previous exercice :
docker pull abcdesktopio/oc.template.gtk.wine\n
This image embeded the architecture format win32
win64
. By default the WINEARCH
is set to win32
. The playonlinux
package is all ready installed.
homedirectorytype
option","text":"To share the home directory /home/balloon
volume data between containers, set the desktop.homedirectorytype
to 'volume'
in your od.config file.
Edit your own od.config
file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype
is set to 'volume'
desktop.homedirectorytype: 'volume' \n
If need, run the docker-compose restart
command in your abcdesktop directory where the od.config
and the docker-compose.yml
are located.
docker-compose restart\n
"},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.
PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.
Start an abcdesktop session. You can use an authenticated session using an authentication provider external
or explicit
, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit
.
In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.
Login using the Anonymous
authentification provider.
Click on the menu and choose settings options
On the Settings
dialog box, choose System
option
Choose the User container
tabs, and select the hostname
value.
Copy this value into your clipboard. The hostname use the docker containerid
value.
Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.
Run the docker inspect -f \"{{ .HostConfig.Binds }}\"
and add your CONTAINER ID
as parameter.
CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n
where CONTAINER_ID is your own containerid
value.
For example
docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n
You should read the volume name starting by the prefix tmp-
with your uuid value, and a second volume name starting by the prefix home-
with your uuid:
[tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n
We are using the /tmp
volume and the /home/balloon
volume of your container.
If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf
. The name of the tmp
volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf
and the name of tmp
volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf
If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes
. The name of the tmp
volume is tmp-hermes
and the name of tmp
volume is home-hermes
.
Replace in the command the string TMP_VOLUMENAME
by your own tmp volume name.
Replace in the command the string HOME_VOLUMENAME
by your own home volume name.
docker run -it -v TMP_VOLUMENAME:/tmp -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n
For example with an anonymous user:
docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n
Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp
. You get a prompt inside the new docker container.
To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n
Init the wine directory
wineboot --init\n
After few seconds you should read on the standard error
0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n
And now download putty.exe from the web site https://www.putty.org/.
In this example, we use the 64 bits binary format
balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
Start the putty.exe
with wine, with the command wine putty.exe
balloon@5719b77d3f2a:~$ wine putty.exe\n
After few seconds you should read on the standard error
0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n
The wine prefix is WINEPREFIX=/composer/.wine
, all files used by wine are stored in /composer/.wine
directory.
On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :
You can use this Putty Windows application to connect to another host using ssh
or telnet
protocol.
The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell
Click on the Web Shell
icon, a new Terminal WebShell is now opened :
Run the command to list each X11 windows and get the WMClass name.
wmctrl -lx \n
Read the WM_CLASS of the Putty Wine application: putty.exe.Wine
Then exit the web shell
and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine
.
In this chapter we are going to build a new docker image for abcdesktop
The new image is the putty.
Create a directory named build
, and create a directory icons
inside build
mkdir build\nmkdir build/icons\ncd build\n
To build your own json file.
Create a json file named applist.json
, inside build directory, and add the content to the json file.
[\n{\n \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n \"preruncommands\": [ \n \"ENV WINEARCH=win64\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.exe.Wine\",\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine\",\n \"path\": \"/usr/bin/wine\"\n}\n]\n
To fill the data inside the json file :
name Type Datacat
string utilities icon
string putty.svg keyword
string putty,ssh,terminal launch
string putty.exe.Wine name
string putty path
string /usr/bin/wine args
string /composer/bin/putty.exe template
string abcdesktopio/oc.template.gtk.wine You can read the following help lines.
cat
is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
icon
is the name of the icon. abcdesktop support only svg
icon file format. To get the icon file, look at the link https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svgkeyword
is a list of the keywords to find the application. Set the value to putty,ssh,terminal
.launch
is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below). name
is the name of the application. Set the value to putty.path
is the binary path to run the application. template
is the name of the parent image. The default image parent for wine is abcdesktopio/oc.template.gtk.wine
. Save the putty icon file on SVG format to the icons directory.
wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
"},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json
","text":"To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.
Save make.js
it to you build directory. make.js
is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.
If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n
In the build directory, you should have
drwxr-xr-x 5 devuser staff 160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser staff 992 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 497 Mar 11 15:15 applist.json\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 icons\n-rw-r--r-- 1 devuser staff 6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 .\ndrwxr-xr-x 5 devuser staff 160 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 1909 Oct 31 2015 putty.svg\n
Run the command make.js
node make.js\n
make.js
build a new DockerFile for putty
application. Remember, all application images use container images.
You should get the output
{\n template: 'abcdesktopio/oc.template.gtk.wine',\n preruncommands: [\n 'ENV WINEARCH=win64',\n 'USER $BUSER',\n 'RUN wineboot --init',\n 'RUN echo disable > $WINEPREFIX/.update-timestamp', \n 'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n ],\n args: '/composer/bin/putty.exe',\n cat: 'utilities',\n debpackage: '',\n icon: 'putty.svg',\n keyword: 'putty,ssh,terminal',\n launch: 'putty.exe.Wine',\n name: 'putty-wine',\n displayname: 'Putty Wine',\n path: '/usr/bin/wine'\n}\n
The new files putty-wine.d
has been generated :
putty-wine.d
is the Dockerfile for your putty abcdesktop applicationRead the content of the Dockerfile putty-wine.d
. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.
Now it's time to build your putty app. Run the command docker build
command.
docker build --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n
You should read on the standard ouput
[+] Building 21.6s (10/10) FINISHED \n => [internal] load build definition from putty-wine.d 0.0s\n => => transferring dockerfile: 12.46kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev 0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev 0.0s\n => [2/6] RUN wineboot --init 10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe 0.6s \n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 9.2s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.4s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 0.4s \n => => exporting layers 0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd 0.0s \n => => naming to docker.io/library/putty-wine.d 0.0s\n
Now, your new image is ready to run.
"},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.
Using your web browser or a curl command, call a http request to notify the API Server
http://localhost/API/manager/buildapplist\n
This http request return a json object, with all docker images details :
Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.
In the search area, type putty
. Click on the Putty
Application.
Wine is starting your Putty
application :
Great, you have build a abcdesktop image for Putty
, build the application image Putty
. You can push this image to your own private docker registry.
user.reg
and system.reg
windows registry files","text":"This is a quick and dirty solution, but it works fine
Your wine configuration is stored in /composer/.wine
, and by default user.reg
and system.reg
are located in the WINEPREFIX
directory. The user.reg
and system.reg
files build when wine starts.
To make a copy of fresh running putty-wine.d
image. Start your putty-wine.d
image and using a shell located the new user.reg
and system.reg
files
docker ps -a | grep putty-wine\n65d95f4e7717 putty-wine.d:latest \"/composer/appli-doc\u2026\" 16 seconds ago Up 15 seconds anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n
Then copy files using the docker cp
command
CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n
Add them to your default putty-wine.d
image using applist.json file :
[\n{\n \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n \"preruncommands\": [ \n \"ENV WINEARCH=win64\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.exe.Wine\",\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine\",\n \"path\": \"/usr/bin/wine\"\n}\n]\n
Rebuild your Dockerfile
node make.js\n
{\n template: 'abcdesktopio/oc.template.gtk.wine',\n preruncommands: [\n 'ENV WINEARCH=win64',\n 'USER $BUSER',\n 'RUN wineboot --init',\n 'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n 'RUN echo disable > $WINEPREFIX/.update-timestamp',\n 'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n ],\n args: '/composer/bin/putty.exe',\n cat: 'utilities',\n debpackage: '',\n icon: 'putty.svg',\n keyword: 'putty,ssh,terminal',\n launch: 'putty.exe.Wine',\n name: 'putty-wine',\n displayname: 'Putty Wine',\n path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n
Run the command docker build
command.
docker build --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n
Now your wine keep your registry's updates.
"},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"abcdesktop use docker image format with some labels to describe the application.
"},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":"lmdpocpetit
, but this value may have been changed.In this chapter we are going to build a new docker image for abcdesktop
The new image is the game 2048.
Create a directory named build
, and create a directory icons
inside build
mkdir build\nmkdir build/icons\ncd build\n
To build your own image create first a json file.
Create a json file named applist.json
, inside build directory, and add the content to the json file.
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n }\n]\n
To fill the data inside the json file :
name Type Datacat
string games debpackage
string 2048-qt icon
string 2048_logo.svg keyword
string 2048 launch
string 2048-qt.2048-qt name
string 2048 path
string /usr/games/2048-qt template
string abcdesktopio/oc.template.gtk You can read the following help lines, or fill the json missing value by yourself.
cat
is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]debpackage
is the name of the 2048 ubuntu package. To find the package name, look at the link 2048 Ubuntu Package.icon
is the name of the icon. abcdesktop support only svg
icon file format. To get the icon file, look at the link https://upload.wikimedia.org/wikipedia/commons/1/18/2048_logo.svgkeyword
is a list of the keywords to find the application. Set the value to 2048.launch
is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below). name
is the name of the application. Set the value to 2048.path
is the binary path to run the application. template
is the name of the parent image. The default image parent is abcdesktopio/oc.template.gtk
. You will learn how to customize your own template image, in next chapter. Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons
command :
2048_logo.svg\n
"},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.
Save make.js
it to you build directory. make.js
is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.
If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.
In the build directory, you should have
drwxr-xr-x 5 devuser staff 160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser staff 992 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 265 Mar 11 15:15 applist.json\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 img\n-rw-r--r-- 1 devuser staff 8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x 3 devuser staff 96 Mar 11 15:02 .\ndrwxr-xr-x 5 devuser staff 160 Mar 11 15:15 ..\n-rw-r--r-- 1 devuser staff 1909 Oct 31 2015 2048_logo.svg\n
Run the command make.js
node make.js\n
make.js
build a new DockerFile for the 2048 application. Remember, all application images use container images.
You should get the output
{\n cat: 'games',\n debpackage: '2048-qt',\n icon: '2048_logo.svg',\n keyword: '2048',\n launch: '2048-qt.2048-qt',\n name: '2048',\n displayname: '2048',\n path: '/usr/games/2048-qt',\n template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n cat: 'games',\n debpackage: '2048-qt',\n icon: '2048_logo.svg',\n keyword: '2048',\n launch: '2048-qt.2048-qt',\n name: '2048',\n displayname: '2048',\n path: '/usr/games/2048-qt',\n template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n - '2048' : '2048.md'\n
The new files 2048.d
and 2048.md
have been generated :
2048.d
is the Dockerfile for your 2048 abcdesktop application2048.md
is the documentation file for your 2048 abcdesktop applicationRead the content of the Dockerfile 2048.d
. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.
Now it's time to build your 2048 app. Run the command docker build
command.
docker build --build-arg TAG=latest -f 2048.d -t 2048.d .\n
You should read the output :
[+] Building 32.0s (10/10) FINISHED \n => [internal] load build definition from 2048.d 0.0s\n => => transferring dockerfile: 33B 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends 2048-qt && apt-get clean 27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.5s\n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.5s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.4s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 1.1s \n => => exporting layers 1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a 0.0s\n => => naming to docker.io/library/2048.d\n
Check that your image is ready on your system:
Run the docker images command
docker images\n
You should read on the stdout more lines, only 2048.d is listed here :
REPOSITORY TAG IMAGE ID CREATED SIZE\n2048.d latest a861af06b7f0 About a minute ago 1.17GB\n
The total image size of 2048.d is 1.17GB.
The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk
.
The API server receives a new image event from docker. To run the new applications just refresh you web browser page.
"},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"Return to your abcdesktop website http://localhost
and log in as Anonymous.
At the right corner, write in the search bar the keyword 2048
Click on the 2048
icon, and start your first abcdesktop application :
Great it's a good job, you have build your own abcdesktop 2048 application.
Now you can spent a lot of time to reach the 2048 score. Have fun !
"},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Getlaunch
and path
values","text":"To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.
If you want to use abcdesktop as a GNU/Linux host
Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch
and path
.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right corner, write in the search bar the keyword shell
Click on the Web Shell
icon, a new Terminal WebShell is now opened :
Run the command
sudo apt-get update \n
The default password is lmdpocpetit
( if your admin did not change it, otherwise ask to the administrator )
Run the installation command
sudo apt-get install -y 2048-qt \n
You should read the output, during the installation process
On Ubuntu, the games are installed in a dedicated directory /usr/games
.
Read the file list of the 2048-qt Ubuntu package
/usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n
Start the 2048 game binary 2048-qt
in background.
/usr/games/2048-qt & \n
The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.
Run the command to list each X11 windows and get the WMClass name.
wmctrl -lx \n
wmctrl
is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.
-l
list the windows being managed by the window manager. -x
include WM_CLASS in the window listGreat, look at the third value, this is what we are looking for :
launch
is 2048-qt.2048-qt
path
is /usr/games/2048-qt
You can now close your web browser and fill your json file, by yourself
"},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.
By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.
New applist.json data, and build your own Gimp abcdesktop.io application.
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n },\n {\n \"cat\": \"\",\n \"debpackage\": \"\",\n \"icon\": \"\",\n \"keyword\": \"\",\n \"launch\": \"t\",\n \"name\": \"\",\n \"displayname\": \"\",\n \"path\": \"\",\n \"template\": \"\"\n }\n\n]\n
You should get data entries like:
gimp.Gimp
/usr/bin/gimp
[\n {\n \"cat\": \"games\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"2048_logo.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048\",\n \"displayname\": \"2048\",\n \"path\": \"/usr/games/2048-qt\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n },\n {\n \"cat\": \"graphics\",\n \"debpackage\": \"gimp\",\n \"icon\": \"gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"template\": \"abcdesktopio/oc.template.gtk\"\n }\n\n]\n
"},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.
\"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\":\"dds\",\n \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n
These entries allow user to use the file manager choice Open with
and Open with Other Application
and list Recommended Applications
The Gimp Json data shows
{\n \"cat\": \"graphics\",\n \"debpackage\": \"gimp\",\n \"icon\": \"gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\":\"dds\",\n \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n
Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.
"},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"musl versus glibc
"},{"location":"changelog/","title":"abcdesktop change log","text":"Logs of all notable changes made to abcdesktop.io
"},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":"WEBSOCKIFY_HEARTBEAT
in od.config file OR use proxy-read-timeout
and proxy-send-timeout
annotations to kind: Ingress
--heartbeat=${WEBSOCKIFY_HEARTBEAT}
to /usr/bin/websockify to keep sessionClusterRole
to role
-- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442
"},{"location":"faq/","title":"FAQ","text":"List of questions and answers relating to abcdesktop.io
A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.
"},{"location":"faq/#networking","title":"Networking","text":"This list of questions and answers is relating network, talking about
I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?
We use the kubectl port-forward
to the nginx pod
NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n
Then open your web browser to reach the http://localhost
Then open your web browser, you get the home page, login using LDAP auth
or Anonymous auth
.
Then login, and you get a pod user.
For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.
"},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?
To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort
, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer
.
Delete the previous abcdesktop's nginx service
kubectl delete service nginx -n abcdesktop\n
Create a new nginx service yaml file named nginx-lb.yaml
The new nginx service type is LoadBalancer
kind: Service\napiVersion: v1\nmetadata:\n name: nginx\n namespace: abcdesktop\nspec:\n type: LoadBalancer\n selector:\n run: nginx-od\n ports:\n - protocol: TCP\n port: 80\n targetPort: 80\n name: http\n
Apply the nginx service type LoadBalancer
kubectl apply -f nginx-lb.yaml\nservice/nginx created\n
Wait for an EXTERNAL-IP
from you kubernetes cloud provider
kubectl get service nginx -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.105.75 <pending> 80:31581/TCP 64s\n
You get the EXTERNAL-IP
for your LoadBalancer
kubectl get service nginx -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.172.53 161.35.246.4 80:30443/TCP 2m36s\n
In case, the LoadBalancer
service returns the EXTERNAL-IP
161.35.246.4 Then open your web browser to reach this EXTERNAL-IP
161.35.246.4.
Login using Philip J. Fry
And you should get the fry
desktop
A Kubernetes Ingress Controller acts as a reverse proxy.
In the Ingress
, define a path to the abcdesktop's nginx service.
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: ingress-demo\n namespace: abcdesktop\nspec:\n rules:\n - host: demo.digital.pepins.net\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: nginx\n port:\n number: 80\n ingressClassName: nginx\n
The request path: /
is proxyfied to service named nginx in abcdesktop namespace.
My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.
The message Your abcdesktop session has been disconnected. Please reload this page
appears when the websockify
websocket is disconnected.
Add an heartbeat value to send a ping to the client every INTERVAL seconds
Edit the od.config
file, add to the desktop.envlocal
option 'WEBSOCKIFY_HEARTBEAT':'30'
desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n
In this case, the command /usr/bin/websockify
sends a ping to the client every 30 seconds. This command runs in the user's pod.
Update the configmap abcdesktop-config
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart the pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
To get more informations how to Keepalive in websockets
Timeout is a main feature to preserve from unnecessary network bandwidth.
"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.
To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.
Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout
and nginx.ingress.kubernetes.io/proxy-send-timeout
annotations to more than 60 seconds.
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: ingress-demo\n namespace: abcdesktop\n annotations:\n nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n rules:\n - host: demo.digital.pepins.net\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: nginx\n port:\n number: 80\n ingressClassName: nginx\n
"},{"location":"faq/#applications","title":"Applications","text":"This list of questions and answers is relating abcdesktop's applications, talking about
/API/manager/images
endpointsTo delete all applications use the images endpoint, replace localhost:30443
by your own datas
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n
It returns a json list of all deleted applications
[\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
"},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n
The first start will pull the 2048 image, so it can take a while.
"},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"To get the json file of a containerized application, you can use docker
command or crictl
command
docker
commanddocker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
crictl
commandcrictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
"},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"Open the webshell
and read the logs files.
The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.
/tmp/lastcmd.log
the init command log file created by /composer/appli-docker-entrypoint.sh/tmp/lastcmdenv.log
the last environment variables file/tmp/NAME OF THE APPLICATION.log
the command log file for the applicationA lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :
https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.
https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.
HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.
https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.
Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.
https://www.kasmweb.com Streaming containerized apps and desktops.
Docker and Wine Docker image that includes Wine and Winetricks for running Windows applications on Linux and macOS
In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]
"},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.
We can approach this problem from three angles:
"},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":"we can share the X11 server socket with the X11 client container as unix file socket on an external shared volume. Applications and X11 server run in dedicated containers.
we can share the X11 server socket with the container using TCP. X11 uses TCP as its transport protocol. Applications and X11 server run in dedicated containers.
To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.
The unix file socket reduce the network tcp overhead.
The unix file socket garantes no latency troubleshooting. X11 uses a chatty protocol so that the network latency has a large impact when using X11
Local is best, thus server and application need to run on the same node, if it can.
"},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remoteDISPLAY
","text":"The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY
in a <canvas>
HTML element.
Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen
rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.
The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :
websockify Websockify just translates WebSockets traffic to normal socket traffic. Websockify accepts the WebSockets handshake, parses it, and then begins forwarding traffic between the client and the target in both directions.
ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.
The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.
abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.
"},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"An application can run as ephemeral container or as pod.
"},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":"nginx
: container act as static web server and reverse proxy routerpyos
: container abcdesktop core control planememcached
: container cache servicemongo
: container database service to store user profil datauser
: pod user, one pod per connected userapplications
: each graphical application runs inside a dedicated container. You need to create an container image for each applicationapplication helper
for a web browser. By example, firefox
container can ask to start videolan
application. Then firefox
is running inside a container, videolan
is running inside another separated container. /dev/shm
between X.org and application is supported with the ephemeral container.Privacy Notice: protecting your personal data
The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.
If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.
In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.
This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.
This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.
Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.
We only process your personal data once we have your consent in the context of you request.
Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.
What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.
Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.
Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.
What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.
How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:
Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15
Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.
How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.
For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.
Modification of the personal data protection notice This Privacy Notice is subject to change.
"},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":"x86-64
( arm-64
is not yet available)Our images support only architectures x86-64
. The architectures supported by this image is:
arm-64
is in progress.
The recommended distrubution is Ubuntu 22.04.2 LTS
Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/
"},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/
"},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":"Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.
To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50
Start pulling this template image :
docker pull abcdesktopio/oc.template.gtk.wine\n
Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine
on the https://hub.docker.com/ web site.
For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine
is created.
Dockerfile information :
dpkg --add-architecture i386
aptitude install -y wine
In this chapter we are going to run notepad.exe
for Windows inside a docker container for abcdesktop.io.
Start an abcdesktop session. You can use an authenticated session using an authentication provider external
or explicit
, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit
.
In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.
Login using the Anonymous
authentification provider.
Keep your web browser open, then on your host, open a terminal shell window and run the command
docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n
The option --filter ancestor=abcdesktopio/oc.user.18.04
ask to filter only container with the image ancestor
set with value abcdesktopio/oc.user.18.04
You should read the container with the image named abcdesktopio/oc.user.18.04
docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n86df3ff126ac abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 3 minutes ago Up 3 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n
Read the values CONTAINER ID
and NAMES
In this example, the CONTAINER ID is 86df3ff126ac
and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138
.
We are using the /tmp
volume of this CONTAINER ID
86df3ff126ac
Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be
. The name of the tmp
volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be
Run a docker inspect -f \"{{ .HostConfig.Binds }}\"
and add your CONTAINER ID
as parameter.
docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n
For example
docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n
You should read the volume name starting by tmp-
with your uuid concatened
[tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n
Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes
. The name of the tmp
volume is tmp-hermes
Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v
parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"
docker run -it -v TMP_VOLUMENAME:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash\n
For example with an Anonymous
user:
docker run -it -v tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n
Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp
. You get a prompt inside the new docker container.
To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n
And now start the notepad.exe
with wine
balloon@8684ae888f74:/$ wine notepad\n
After few seconds you should read on the standard error
balloon@8684ae888f74:/$ wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n
And the notepad window should be open inside your Web browser
This Windows application is running inside a docker container on abcdesktop.io desktop.
In the Terminal shell press CTRL+C
to stop the wine notepad
process, then type exit
to quit your shell in container.
^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n
It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.
"},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"The abcdesktop release 1.0 has started in May 2015
All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"The authentification configuration is set in the od.config
file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.
Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.
"},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"The authmanagers is defined as a dictionnary object :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
The od.config defines 3 kinds of entries in the authmanagers
object :
external
: use for OAuth 2.0 Authentificationexplicit
: use for LDAP, LDAPS and ActiveDirectory Authentificationimplicit
: use for Anonymous Authentificationexternal
OAuth 2.0 Authentification explicit
LDAP, LDAPS and Active Directory Authentification implicit
Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"You should have read the hands-on :
Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit
, explicit
, and external
, as describe :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
Save your new od.config file.
The config file od.config
has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.
docker-compose restart
Start your web browser and open the URL http://localhost
The Web home page should only show the title abcdesktop.io. There is no authmanagers
available.
Great you can now add some value to authenticate your users.
"},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagersimplicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.
explicit
:","text":"explicit
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.
external
:","text":"external
is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.
In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers
dictionnary as described for example :
authmanagers: {\n 'external': {\n 'providers': {\n 'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'client_id': 'XXXXXXX', \n 'client_secret': 'YYYYYYY', \n 'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n 'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n },\n 'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'client_id': 'AAAAAAAA', \n 'client_secret': 'BBBBBBBB',\n 'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n 'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n 'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n },\n 'mobileorange': { \n 'displayname': 'Mobile Connect', \n 'enabled': False,\n 'client_id': 'CCCCCCCC', \n 'client_secret': 'DDDDDDDD',\n 'basic_auth': True,\n 'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n 'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n 'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n },\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'EEEEEEEE.apps.googleusercontent.com', \n 'client_secret': 'FFFFFFFF',\n 'scope': 'https://www.googleapis.com/auth/userinfo.email',\n 'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n 'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n 'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n 'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n }\n }\n },\n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n }}\n\n\nadconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.1.12', '192.168.1.13' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True\n}}\n
"},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"1.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string not used by ldap, only used by Active Directory providers
dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref
.
Providers :
The provider is formated as a dictionnary
{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The ldapconfig is a dictionnary.
For example :
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ '192.168.8.195' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n\n}\n
"},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this domain as default domain True ldap_protocol
string protocol type. ldap
or ldaps
for LDAP directory services ldap
tls_require_cert
boolean The default value is False. tls_require_cert
apply only if ldap_protocol
is set to ldaps
. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True
This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
False basedn
string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ]
IP Address or FQDN values scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"You should have all read and done the hands-on :
To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.
Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing
"},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"Update the docker-compose.yml
file to add an ldap as directory server
The specific openldap
section is describe as a service. The new complete docker-compose.yml
file is now :
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'abcdesktopio/oc.nginx'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\n openldap:\n image: abcdesktopio/oc.openldap\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
"},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config
configuration file","text":"Update the od.config
configuration file.
Add the explicit
entry to the dictionary authmanagers
.
authmanagers: {\n 'external': {\n },\n 'explicit': {\n 'show_domains': True,\n 'providers': {\n 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n }}\n\n\n
Note: the config_ref
is ldapconfig
.
Add a new dictionnary object named ldapconfig
to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'openldap' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n
Note: the server name is the name of the service entry
Save your new od.config file.
The config file od.config
has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.
docker-compose restart
Open the URL:http://localhost
The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"1.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
The explicit
authentification support the directory services ldap
, ldaps
, and Microsoft Active Directory
.
Configuration sample for Microsoft Active Directory
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
"},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers
"},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"1.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'XXX',\n 'client_secret': 'YYY',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n }\n
"},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"Facebook's OAuth is supported for authentication.
"},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'XXX', \n 'client_secret': 'YYY', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n
"},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"1.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionnary object and contains an anononymous
provider.
anononymous
provider always permit authentification, and create a uuid as userid. anononymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anononymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers dictionnary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Press the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command docker ps -a
docker ps -a\n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When the anonymous container is removed, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
Controller DescriptionAccountingController
accounting data json and ebnf format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, runApplication) CoreController
get configuration and user message info ManagerController
manage pyos PrinterController
CRUD printer object StoreController
CRUD key value data UserController
retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"The AccountingController
and ManagerController
access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller
name and with an entry permitip
. The permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or the controller
name is not set, all ip source address are allowed the send a request to the controller.
The controllers
dictionnary is defined in the od.config
file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.
By default others controllers access is enabled, without ip restriction.
controllers : { \n 'AccountingController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'ManagerController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'PrinterController' : { 'permitip': None },\n 'StoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n } \n
If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.
In Kubenetes Mode: Read the setup guide, to make change in the abcdesktop yaml file. Setup and configuration guide for kubernetes abcdesktop
In Docker Mode : Read the following chapter
This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.
"},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":"docker-compose
command ready to runCreate a directotry named abcdesktop
in your home directory.
cd\nmkdir -p abcdesktop\n
To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config
where docker-compose.yml file is located.
Download sample configuration file od.config then rename the od.config.reference
file as od.config
docker-compose down\n
You should read on the standart output
Removing open_nginx_1 ... done\nRemoving open_pyos_1 ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1 ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
"},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml
","text":"Edit your docker-compose.yml
to add a volumes entry to pyos services
Example : My working directory is /home/alex/abcdesktop
Add the new entry in volumes
volumes:\n - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n
For example, the docker-compose.yml
contains
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'abcdesktopio/oc.nginx'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
"},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"Now, it's time to make a change in your od.config file.
Download the od.config file and save it to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
Change the defaultbackgroundcolors in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local oc.config file.
Run your docker-compose
To restart your docker-compose, run the command
docker-compose up\n
When the od.config change, od.py reload this configuration file automatically.
You should read at the standard ouput of docker-compose
Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1 ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1 ... done\nStarting abcdesktop_pyos_1 ... done\nStarting abcdesktop_nginx_1 ... done\n[ lines cut here ]\n
"},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colors and you should have it as background color :
Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.
"},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"Click on the Docker icon in MacOS/X menu bar.
Then choose Preferences...
The following window should appear :
Choose Kubernetes
, then check the Enable Kubernetes
Kubernetes stay in Starting
state during few minutes. Please wait to download all container images and for kubernetes installation process.
On the bottom you should read next Docker Running
Kubernetes Running
Great, you have installed Kubernetes on MacOS/X.
"},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the newkubectl
command","text":"Open a Terminal, then run the command kubectl version
% kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n
Run the command kubectl get pods
% kubectl get pods\nNo resources found.\n
Great, the kubectl command works. It's time to deploy abcdesktop.io
"},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"Click on the Docker Desktop
icon in the windows tray.
The following menu should appear, choose Settings
:
The following window should appear :
Choose Kubernetes
, then check the Enable Kubernetes
Press the Apply and Restart
button. Please wait to download all container images and for kubernetes installation process.
On the bottom you should read next Docker Running
and Kubernetes Running
.
Great, you have installed Kubernetes on Windows 10.
"},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the newkubectl
command","text":"Open a Terminal cmd.exe
, then run the command kubectl version
Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n
Run the command kubectl get pods
kubectl get pods\nNo resources found.\n
Great, the kubectl command works. It's time to deploy abcdesktop.io
"},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.
Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.
To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.
"},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"Here are officials available encryption providers (Kubernetes Official page ):
Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther Considerationsidentity
NoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbc
AES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox
.secretbox
XSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcm
AES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kms
Uses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user. aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider
"},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"In /etc/kubernetes
directory, create a directory named aescbc:
sudo mkdir /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"Create aescbc yaml configuration file:
sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n - resources:\n - secrets\n providers:\n - aescbc:\n keys:\n - name: key1\n secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n - identity: {}\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"Secret key can be generated using the following command:
head -c 32 /dev/urandom | base64\n
In encrypt_config.yaml, replace secret for key1 in aescbc.keys section
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:
sudo chmod -R 600 /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"Edit kube-apiserver.yaml
configuration file:
vim /etc/kubernetes/manifests/kube-apiserver.yaml\n
In spec.containers.command section add:
- --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n
In spec.containers.volumeMounts section add:
- mountPath: /etc/kubernetes/aescbc\n name: aescbc-config\n readOnly: true\n
In spec.volumes section add:
- hostPath:\n path: /etc/kubernetes/aescbc\n type: DirectoryOrCreate\n name: aescbc-config\n
save the file
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:
kubectl -n kube-system get pods\n
NAME READY STATUS RESTARTS AGE\ncoredns-66bff467f8-69b8r 1/1 Running 0 21h\ncoredns-66bff467f8-74j9n 1/1 Running 0 21h\netcd-cube05 1/1 Running 0 21h\nkube-apiserver-cube05 1/1 Running 0 6s\nkube-controller-manager-cube05 1/1 Running 1 21h\nkube-flannel-ds-amd64-p9xhq 1/1 Running 0 20h\nkube-proxy-8xk5g 1/1 Running 0 21h\nkube-scheduler-cube05 1/1 Running 1 21h\n
At this state, all created secrets will be crypted in etcd
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"sudo kubectl -n default describe secret secret1\n
Name: secret1\nNamespace: default\nLabels: <none>\nAnnotations: <none>\n\nType: Opaque\n\nData\n====\nmykey: 6 bytes\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"To verify secret encryption we will install etcd client package
apt-get install etcd-client\n
Run the following command:
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n
Output will appear with the following text k8s:enc:aescbc:v1:key1:
followed by binary values.
Secrets are now encoded with aescbc v1 provider using key1
"},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:
"},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.
"},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:
Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.
docker volume create myshared \n
"},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.
Note: We do not need the default 5900 VNC tcp port any more.
docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n
You should see a prompt like :
root@6de36e574877:/#\n
Install the package wget Install the library files for tigervnc.
Package list:
Those packages are used by tigervnc. We need to install them.
apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n
Download the last tigervnc X11 graphics server from the bintray.com web site
wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n
Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system
cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n
Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section
Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n
You should read the output
Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar 3 11:05:48 2020\n vncext: VNC extension running!\n vncext: Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext: created VNC server for screen 0\n
Check that the Xvnc TigerVNC release is 1.10.0.
Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.
"},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.
ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.
Before, install the package gcc g++ make curl
apt-get install -y gcc g++ make curl \n
Install nodejs and npm
curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
apt-get install -y nodejs\n
Install ws-tcp-bridge
npm install ws-tcp-bridge -g\n
Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background
Add the &
at the end of the command line to run this process in background
/usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n
You should read on the standard output
proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n
Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket
"},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"On the container myx11server, to get the container local IP Address, install the package net-tools package
apt-get install -y net-tools\n
And run the ifconfig command
ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255\n ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)\n RX packets 65149 bytes 95569807 (95.5 MB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 20880 bytes 1159982 (1.1 MB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n
Write here the ip address of your container myx11server:
IP Address of myx11server _ . . _ .
"},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.
docker run -it --name mywebserver -p 80:80 ubuntu:latest\n
You should see a prompt like:
root@96df62a73e4f:/# \n
Install nginx webserver, run the command
apt-get update\napt-get install -y nginx-extras\n
Install the git and vim package, run the command
apt-get install -y git vim\n
Clone the novnc git on github.com, inside the nginx's root directory.
cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n
You should read on the standart output
Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n
Start the nginx web server
nginx\n
The web server nginx is running in backgound.
Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.
"},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"Install the ping command, run the command
apt-get install -y iputils-ping\n
Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address
ping -c 5 xxx.xxx.xxx.xxx\n
In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2
ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n
The container webserver should receive package from the myx11server container
"},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.
vim /etc/nginx/sites-enabled/default\n
In the server section, after the line location you should found :
location / {\n # First attempt to serve request as file, then\n # as directory, then fall back to displaying a 404.\n try_files $uri $uri/ =404;\n }\n
Add a /websockify route to proxyfied the websocket http request to your myx11server container.
location = /websockify {\n proxy_buffering off;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_pass http://XXX.XXX.XXX.XXX:6081/;\n }\n
You have to replace the line
proxy_pass http://XXX.XXX.XXX.XXX:6081/;\n
by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/
proxy_pass http://172.17.0.2:6081/;\n
The complete server section in the nginx file is for example
server {\n listen 80 default_server;\n listen [::]:80 default_server;\n\n # SSL configuration\n #\n # listen 443 ssl default_server;\n # listen [::]:443 ssl default_server;\n #\n # Note: You should disable gzip for SSL traffic.\n # See: https://bugs.debian.org/773332\n #\n # Read up on ssl_ciphers to ensure a secure configuration.\n # See: https://bugs.debian.org/765782\n #\n # Self signed certs generated by the ssl-cert package\n # Don't use them in a production server!\n #\n # include snippets/snakeoil.conf;\n\n root /var/www/html;\n\n # Add index.php to the list if you are using PHP\n index index.html index.htm index.nginx-debian.html;\n\n server_name _;\n\n location / {\n # First attempt to serve request as file, then\n # as directory, then fall back to displaying a 404.\n try_files $uri $uri/ =404;\n }\n\n location = /websockify {\n proxy_buffering off;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_pass http://172.17.0.2:6081/; # change this line \n }\n\n\n # pass PHP scripts to FastCGI server\n #\n #location ~ \\.php$ {\n # include snippets/fastcgi-php.conf;\n #\n # # With php-fpm (or other unix sockets):\n # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n # # With php-cgi (or other tcp sockets):\n # fastcgi_pass 127.0.0.1:9000;\n #}\n\n # deny access to .htaccess files, if Apache's document root\n # concurs with nginx's one\n #\n #location ~ /\\.ht {\n # deny all;\n #}\n}\n
Now, it's time to reload your nginx configuration, by running the command
nginx -s reload\n
"},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.
Go to the URL http://localhost or the ip address of your own server
In this exercice in use localhost
in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name
of your own server.
http://localhost\n
or
http://YOUR_SERVER_IP_ADDRESS\n
You should read the Welcome to nginx! message in your web browser
Go to the noVNC URL http://localhost/noVNC/vnc.html
http://localhost/noVNC/vnc.html\n
Remember, remplace localhost by your fully qualified domain name
if need
You should read the Welcome to nginx! message in your web browser
To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:
not checked
localhost
(or your host ip address where your contianers are running )80
/websockify
Then, press the Connect
Button
On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.
docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install libreoffice application, run the install libreoffice command in your mylibreoffice container.
apt-get update\napt-get install -y libreoffice\n
Run the soffice command to start Libreoffice
export DISPLAY=:0.0\nsoffice --writer\n
You should read the output
(soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n
On the web browser, the application Libreoffice Writer
should appear.
Type some text data like 'Hello, I am running inside a docker container'
"},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"To move, resize, close, the windows applications, we need a windows manager. abcdesktop
is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.
Run the install openbox command in your myx11server container.
apt-get install -y openbox\n
Set the DISPLAY environment variable to :0.0 and start openbox in background
export DISPLAY=:0.0\nopenbox &\n
Now, you can move the Libreoffice
windows. All windows are decorated.
Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice
Lot of application are ready to use for abcdesktop. All applications are opensource.
You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.
docker pull abcdesktopio/$APP.d\n
for example to download libreoffice calc, run the command
docker pull abcdesktopio/calc.d\n
Read the list of all applications on the application list page
"},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"Go to the abcdesktop directory (where the docker-compose.yml
is located), and run the bash commands :
echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\" | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n
Great, you have uninstalled abcdesktop in non-cluster hosts.
"},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.
"},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":"Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.
docker volume create myshared \n
"},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"Start the first graphical container named myx11server, forward the tcp port 5900 to the container.
docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n
You should see a prompt like :
root@6de36e574877:/#\n
Install the X11 graphics server tigervnc
apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n
Start the X11 graphics server tigervnc
Xvnc :0 -SecurityTypes=none &\n
You should read the output
Xvnc TigerVNC 1.7.0 - built Dec 5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar 2 11:43:56 2020\n vncext: VNC extension running!\n vncext: Listening for VNC connections on all interface(s), port 5900\n vncext: created VNC server for screen 0\n
Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.
We will use the host tcp port 5900 to connect VNC Client.
"},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/
Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.
Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.
This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue
button.
This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.
You need to confirm the uncrypted connection warning dialog box. Press the Continue button.
A black screen should appear :
Keep this VNC Client running, we will use this display to show our applications later.
"},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.
docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install standart application like xedit, xman or xeyes, install the package x11-apps.
Run those commands in your myx11server container.
apt-get update\napt-get install -y x11-apps\n
Set the DISPLAY environment variable to :0.0 and then start the xedit command.
export DISPLAY=:0.0\nxedit\n
On the VNC Viewer, the application xedit should appear.
Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.
"},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.
Run the install openbox command in your myx11server container.
apt-get install -y openbox\n
Set the DISPLAY environment variable to :0.0 and then start openbox.
export DISPLAY=:0.0\nopenbox\n
The Openbox message appear to the sdterr
Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n
Now, you can move the window xedit. The windows are decorated.
"},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"Activate the window shell with your myapp running container, and press CTRL+C
root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n
You can remove your docker container, to clean up your environment
docker rm myapp\n
"},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.
docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n
You should see a prompt like :
root@96df62a73e4f:/# \n
To install firefox application, run the install firefox command in your myfirefox container.
apt-get update\napt-get install -y firefox\n
Run the firefox command
export DISPLAY=:0.0\nfirefox\n
You should read the output
\n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n
On the VNC Viewer, the application firefox should appear.
Check that firefox works and go to your favorite web site.
"},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared
Run the commands :
docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n
Keep the docker images ubuntu, we will use it in the next chapter
"},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"In the next chapter, we will replace the VNC Client by a web browser.
"},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"The abcdesktop release 2.0 has started in May 2020
All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"2.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionary object and contains an explicit
provider.
For example :
'explicit': {\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
default_domain
string set the default domain name, if user does not prefix the login by domain\\s. default_domain
is only used by Active Directory provider providers
dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref
.
The provider is formatted as a dictionary. Example for a provider
defined as planet
{ 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True \n }\n }\n
Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet'
, where key
is config_ref
and value
is the dictionary variable name. enable boolean True
to enable or False
to disable the provider configuration The ldapconfig
is a dictionary.
For example :
ldapconfig : { \n 'planet': { \n 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://192.168.8.195' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n } \n } \n}\n
"},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only
boolean Do not run ldap queries, only use to run authentication False auth_type
string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn
string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap
or ldaps
for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ]
LDAP server address IP Address or FQDN value scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
serviceaccount
dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }
or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }
"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"Ldap service account permits service account binding. A service account can be defined using clear text login
and password
data, or as file reference login
and password
starting by file://
.
login
starts by file://
, then pyos open the defined file to read login data.password
starts by file://
, then pyos open the defined file to read password data.The file reference file://
for login
and password
is used to read kubernetes secret file data.
To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.
Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing
"},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update theod.config
configuration file","text":"Update the od.config
configuration file.
Add the explicit
entry to the dictionary authmanagers
.
authmanagers: {\n 'external': {\n },\n 'explicit': {\n 'show_domains': True,\n 'providers': {\n 'planet': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n }} \n
Note: the config_ref
is ldapconfig
.
Add a new dictionary object named ldapconfig
to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing
ldapconfig : { 'planet': { \n 'default' : True, \n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap' ] }}\n
Save your new od.config file.
Open the URL:http://localhost:30443
The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"2.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionary object and contains an explicit
provider.
The explicit
provider support the directory services ldap
, ldaps
, and Microsoft Active Directory
, and SIMPLE
, NTLM
and KERBEROS
protocols.
Configuration sample for Microsoft Active Directory
with KERBEROS
protocol :
'explicit': {\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'KERBEROS'\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
"},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP explicit authmanagers
"},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"2.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'XXX',\n 'client_secret': 'YYY',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n }\n
"},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"Facebook's OAuth is supported for authentication.
"},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'XXX', \n 'client_secret': 'YYY', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n }\n
"},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'XXX-YYY.apps.googleusercontent.com', \n 'client_secret': 'XXX',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token'\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"2.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easiest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionary object and contains an anonymous
provider.
anonymous
provider always permits authentification, and create a uuid as userid. anonymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anonymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers
dictionary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Select the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command
kubectl get pods -n abcdesktop \n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When an anonymous user close his session, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"2.0/config/authmetaexplicit/","title":"Authentificationmetaexplicit
for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit
object","text":"The metaexplicit
authentification manager contains only one provider. The provider must be defined as metadirectory
.
'metaexplicit': {\n 'providers': {\n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description providers
dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}
"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory
provider configuration","text":"The metadirectory
provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref
.
A metadirectory
provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut
.
coporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } } \n
Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description
value to get the user's trusted domain.
For example :
description: AD\\john\n
Then pyos look for provider AD
configuration and process authentification on domain AD
The metadirectory
accounts can be disabled. The ldap attribut userAccountControl
is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE
set or not.
A service account must defined for a metadirectory
provider. The service account is used to bind the metadirectory.
metadirectory
provider and active directory user domain","text":"The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut
authmanagers: {\n #\n # define the meta explicit manager\n # This is the trusted external forest for the followed domain\n #\n 'metaexplicit': {\n 'providers': {\n # define the metadirectory provider\n # only one metadirectory provider is supported \n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True } \n }\n },\n\n # \n # define the Active Directory provider for each DOMAIN\n # define two domains in two disctinct forest with a trust relationship \n # \n 'explicit': { \n # define an Active Directory provider AD \n 'AD': { 'config_ref': 'adconfig', 'enabled': True },\n # define an Active Directory provider ANOTHER\n 'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True } \n }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': { 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'NTLM',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n 'ldap_basedn' : 'DC=another,DC=super,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.another.super.local',\n 'domain' : 'ANOTHER',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn' : 'ANOTHER.SUPER.LOCAL',\n 'servers' : [ 'ldap://192.168.10.12' ],\n 'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectory
support","text":"metadirectory
support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory
support isMemberOf
on foreign security principal.
The user's SID
of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.
The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )
To get more information about foreign security principal (FSP), read :
Foreign Security Principals Container
Active Directory: Foreign Security Principals and Special Identities
balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
Controller DescriptionAccountingController
accounting data json and ebnf format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, runApplication) CoreController
get configuration and user message info ManagerController
manage pyos PrinterController
CRUD printer object StoreController
CRUD key value data UserController
retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"The AccountingController
and ManagerController
access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller
name and with an entry permitip
. The permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or the controller
name is not set, all ip source address are allowed the send a request to the controller.
The controllers
dictionnary is defined in the od.config
file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.
By default others controllers access is enabled, without ip restriction.
controllers : { \n 'AccountingController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'ManagerController': \n { \n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'PrinterController' : { 'permitip': None },\n 'StoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n } \n
If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode
or in kubernetes mode
.
All desktop options are defined in od.config file. Desktop options start with the prefix desktop.
, then add the name of the option.
desktop.usex11unixsocket
boolean True desktop.defaultbackgroundcolors
list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype
string 'volume' desktop.remotehomedirectorytype
list [] desktop.persistentvolumeclaim
string None desktop.allowPrivilegeEscalation
boolean False desktop.securityopt
list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret
string None desktop.image
string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter
string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer
boolean False desktop.soundimage
string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer
boolean False desktop.usecontainerimage
boolean False desktop.initcontainerimage
string 'abcdesktopio/oc.busybox' desktop.envlocal
dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' }
desktop.nodeselector
dictionary {}
desktop.username
string 'balloon' desktop.userid
integer 4096 desktop.groupid
integer 4096 desktop.userhomedirectory
string '/home/balloon'
desktop.useinternalfqdn
boolean False desktop.uselocaltime
boolean False desktop.host_config
dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }
desktop.application_config
dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }
desktop.policies
dictionary { 'rules':{}, 'max_app_counter':5 }
desktop.webhookdict
dictionary { 'firewall': '192.168.7.1' }
"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"The desktop.usex11unixsocket
force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0
If this feature is enable: A container application need a the DISPLAY. The DISPLAY is in this case :0.0
. The container application and the oc.user container share the same volume /tmp
, and share the X11 unix socket is /tmp/.X11-unix/X0
.
If this feature is disable: A container application need a DISPLAY. The DISPLAY is :0.0
(don't think at IPADDRESS_OF_X11_SERVER:0.0
to protect X11 access control). The two containers share the same network stack by default. The X11 server NEED to listen to a TCP or UDP port.
You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.
TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.
Set the desktop.usex11unixsocket
value to True
in most case, and this should not be changed.
The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application
Value Description''
Use daemon\u2019s default. 'none'
Own private IPC namespace, with /dev/shm not mounted. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system\u2019s IPC namespace. If not specified, daemon default is used, which can either be 'private'
or 'shareable'
, depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.
Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.
If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".
Default value desktop.shareipcnamespace : 'shareable'
This option describes how the default home directory for user user ballon should be created :
None
: no dedicated volume is created, the oc.user container use a directory inside the container. All user data will be removed at logout.'volume'
: This value is only recommended in docker mode. 'volume'
option create a dedicated volume, the oc.user container and applications may share this volume. User home data are persistent.'persistentVolumeClaim'
: This value is only avalaible in kubernetes. PersistentVolumeClaim option use a persistentVolumeClaim to create the user home directory. The persistentVolumeClaim can be mapped to differents storage data (like NFS, iSCSI, RBD...). Read more about persistentVolumeClaim on the kubernetes.io website. You need the set the value of desktop.persistentvolumeclaim
or create a default Persistent Volume Claim named 'abcdesktop-pvc'
This value is only avalaible in kubernetes mode.
desktop.persistentvolumeclaim
is the name of the Persistent Volume Claim if the desktop.homedirectory
is set to 'persistentVolumeClaim'
. The PVC (Persistent Volume Claim) must exist.
Run the kubectl get pvc command
to list the persistent volume claim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nabcdesktop-pvc Bound abcdesktop-pv 5Gi RWO abcdesktop-standard 170d\n
"},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]
For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.
If desktop.remotehomedirectorytype
contains 'cifs' and if the authentification provider get homeDrive
and homeDirectory
attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive
value, and mounted to homeDirectory
.
The desktop.allowPrivilegeEscalation
option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.
The default value is False
You should only set desktop.allowPrivilegeEscalation
to run sudo
command.
In production this value MUST be set to False
The desktop.defaultbackgroundcolors
allow you to change the default background color.
The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]
The desktop.defaultbackgroundcolors
length can contain up to 8 entries. To see the color
Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.
http://localhost\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
You should see the default background colors, for example :
"},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"The desktop.imagePullSecret
is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret
is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
"},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"The desktop.image
is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04
The desktop.printerimage
is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04
The desktop.useprintercontainer
is boolean, to use printer cupsd
service as an separated container. This value is only available in kubernetes mode. The default value is False
.
The desktop.soundimage
is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04
The desktop.usesoundcontainer
is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False
.
The desktop.useinitcontainer
is boolean, to use init container. The default value is False
. The code call the desktop.initcontainercommand
list .
The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.
/home/balloon
must belong to balloon
default user and balloon
default group.
The desktop.initcontainercommand
runs the command at init container. The default value is None
, the default type is list
.
desktop.initcontainercommand example :
desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n
This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096)
.
The desktop.initcontainerimage
is the name of the init container image. The default value is busybox
.
desktop.envlocal
is a dictionary. desktop.envlocal
contains a (key,value) added as environment variables to oc.user.
The default value is :
{ \n 'DISPLAY': ':0.0', \n 'USER': 'balloon', \n 'LIBOVERLAY_SCROLLBAR': '0',\n 'WINEARCH': 'win32',\n 'UBUNTU_MENUPROXY': '0',\n 'HOME': '/home/balloon',\n 'LOGNAME': 'balloon',\n 'PULSE_SERVER: '/tmp/.pulse.sock', \n 'CUPS_SERVER': '/tmp/.cups.sock' \n}\n
Add 'CUPS_SERVER: '/tmp/.cups.sock'
only if desktop.useprintercontainer
is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock'
only if desktop.usesoundcontainer
is True.
desktop.nodeselector
is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.
{ 'disktype': 'ssd' }\n
"},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"desktop.username
describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"desktop.userid
describes the uid
of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"desktop.groupid
describes the gid
of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
RUN groupadd --gid 4096 $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"desktop.userhomedirectory
describes the homedirectory
of the user created inside the oc.user container. The type of desktop.userhomedirectory
is string. The default value is /home/balloon
.
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.
"},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"The desktop.uselocaltime
is boolean, to use host value of /etc/localtime
. The default value is False
. If desktop.uselocaltime
is True, this add a volume mapping from host file /etc/localtime
to container file /etc/localtime
.
The desktop.policies
is a dictionary.
max_app_counter
limit applications counter, without checking the docker container status rules
rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }
acl
allow or denied desktop creation Example
desktop.policies: { 'rules':\n { 'volumes': \n { 'domainuser': \n { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n 'Mygroupteam': { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n } \n },\n 'acls' : {},\n 'max_app_counter' : 4 }\n
"},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config
Define how the application can be run, read host_config description page to get more informations
"},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config
Define how the oc.user container can be run, read host_config description page to get more informations
"},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"desktop.webhookdict is a dictionary to add key/value to the command create
and destroy
in rules objects.
WARNING desktop.desktopuseinternalfqdn
is an experimental feature, keep this value to False in production
desktop.desktopuseinternalfqdn
describes the content of the payload data in the JWT Desktop Token. The default value is False
.
Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False
the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True
the payload data in the JWT Desktop Token contains the FQDN of the user Pod.
If you CAN NOT add endpoint_pod_names
in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn
to False
. This choice is less secure.
To set desktop.desktopuseinternalfqdn
to True
value, you have to update the coredns
ConfigMap.
kind: ConfigMap\napiVersion: v1\nmetadata:\n name: coredns\n namespace: kube-system\ndata:\n Corefile: |\n .:53 {\n log\n errors\n health\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n endpoint_pod_names\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n transfer to * \n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf\n cache 30\n loop\n reload\n loadbalance\n }\n
"},{"location":"2.0/config/editconfig/","title":"How to edit pyos
core service configuration file","text":"The pyos
core service configuration file name is od.config
If the od.config
file does not exist, download the default od.config file and save it as od.config
to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
"},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"Change the defaultbackgroundcolors
option in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local file od.config
.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"To check that the new colours are presents in front, open the url http://localhost:30443
, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colour and you should have it as background colour :
Great, you can easily update your configuration file od.config
.
The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"The abcdesktop release 3.0 has started in May 2022
containerd
is recommended by defaultIn release 3.0, the abcdesktop control plane uses only Kubernetes
API. It doesn't depend to dockerd
.
Auth service supports LDAP Posix Account
"},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"Application can run as :
kubernetes pod
kubernetes ephemeral container
Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath
on each worker node or as persistentVolumeClaim
. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.
Ephemeral container
and Pod
","text":"An abcdesktop application can run as a kubernetes ephemeral container
or as a pod
.
An ephemeral container
can access to share memory shm
with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container
does not prevent cpu and memory resource limits.
A pod
can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod
, you can specify resource limits.
To describe the difference between ephemeral-container
and pod-application
, we use the game 2048, one instance come from alpine based on gtk
, the second one come from ubuntu based on qt
2048-alpine
is a GTK application, and is defined to run as ephemeral-container
2048-ubuntu
is a QT application, and is defined to run as a kubernetes podjq
command preinstalled.Get a shell to your abcdestkop server.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download2048-alpine
and 2048-ubuntu
json files","text":"Open a shell to your abcdesktop server
curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n
Check that the json files are downloaded
$ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n
Look at the label oc.containerengine for each json file
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n
The response is ephemeral_container
ephemeral_container\n
This application 2048-alpine will start as an ephemeral_container
cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n
The response is pod_application
pod_application\n
This application 2048-ubuntu will start as a pod_application
, it's a pod.
2048-alpine
and 2048-ubuntu
applications to your abcdesktop service","text":"curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n
Each curl command returns a complete json document.
Wait for the pull pod are Ready
kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n
Wait for condition met
pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :
http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"Login in as the user Hermes Conrad
Hermes Conrad
hermes
Your desktop is created. By default your dock is empty.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"In the search text area, write the keyword 2048
The two applications appear in the search result applications area.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"Start 2048-ubuntu
and 2048-alpine
application
2048-ubuntu
and 2048-alpine
applications start. The application 2048-alpine
can start quickly than the application 2048-ubuntu
.
2048-alpine
is an ephemeral container attached to the graphical container.2048-ubuntu
is a complete kubernetes pod.Get the running pod using kubectl get pods -n abcdesktop
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nhermes-app-2048-ubuntu-4dd6f 1/1 Running 0 8s\nhermes-db906 4/4 Running 0 100s\nmemcached-od-57c57c4f9d-92fs2 1/1 Running 0 38m\nmongodb-od-f69ff6b5b-v6ztc 1/1 Running 0 38m\nnginx-od-58f86c4dc8-8n9lf 1/1 Running 0 25m\nopenldap-od-d66d66bf4-84lg8 1/1 Running 0 38m\npyos-od-5586b88767-gsdl8 1/1 Running 0 14m\nspeedtest-od-6c59bdff75-n6s66 1/1 Running 0 38m\n
The application 2048-ubuntu
is listed as a pod. The application 2048-ubuntu
is a pod. The prefix is the $userid-app
for example hermes-app-2048-ubuntu-4dd6f
, followed by the application name 2048-ubuntu
and a uuid.
The application 2048-alpine
is not a pod.
The application 2048-alpine
is listed as an ephemeral container, inside the user pod hermes-db906
kubectl get pods hermes-db906 -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n
The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses
[\n {\n \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n \"lastState\": {},\n \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n \"ready\": false,\n \"restartCount\": 0,\n \"state\": {\n \"terminated\": {\n \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n \"exitCode\": 0,\n \"finishedAt\": \"2023-05-17T14:38:13Z\",\n \"reason\": \"Completed\",\n \"startedAt\": \"2023-05-17T14:37:00Z\"\n }\n }\n }\n]\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"An ephemeral container
can access to share memory shm
with the X11 server. An ephemeral container run always on the same node as the X11 server.
A pod
can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.
If your application need to share memory with X11 server, when you have to set the oc.containerengine
label to ephemeral_container
.
Use an ephemeral container to start an application have some advantages and some disadvantages.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":"shareProcessNamespace: true
limits
and requests
(cpu, memory)nodeSelector
not supportedUse a kubernetes pod to start an application have some advantages and some disadvantages.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":"limits
and requests
are supportednodeSelector
support an application can run on a dedicated node (for example with GPU)'X11LISTEN': 'tcp'
BadShmSeg
error","text":"If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error
applications to your abcdesktop service","text":"curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n
Wait for the pulled pod are Ready
kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n
Wait for condition met
pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n
Login to your abcdesktop service
Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :
http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"Login in as the user Hermes Conrad
Hermes Conrad
hermes
Your desktop is created. By default your dock is empty.
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"In the search text area, write the keyword 2048
The three applications appear in the search result applications area.
Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.
In the abcdesktop menu, choose Settings
|\u00a0Tasks
.
Then select the Logs
button. The error was 'BadShmSeg (invalid shared segment parameter)'.
(org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n
If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM
value to 1
.
QT_X11_NO_MITSHM=1 \n
Note your can also use QT_XCB_NO_MITSHM
value to 1
chromium
application","text":"For chromium
application disabled shm-usage
with the parameters --disable-dev-shm-usage
disable-dev-shm-usage
get more informations about the dev shm usage and all chromium parameters
no-sandbox
: get more informations about the no-sandbox parameters.
cannot open display
or could not connect to display
error","text":"When you start an application the log file write cannot open display
error
kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba -n abcdesktop \n
qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n
Using the web shell inside an abcdesktop session, start netstat -a
command line
The result should show that the process Xvnc
is listening on tcp port number 6000
hermes:~$ netstat -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 82/Xvnc \n
If Xvnc
is not listening on tcp port number 6000
Update od.config to make Xvnc
listen on tcp port number 6000
Open your od.config file, and look at the desktop.envlocal
option.
Add 'X11LISTEN': 'tcp'
to the dictionary :
desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n 'X11LISTEN' : 'tcp' }\n
Save your local od.config
file.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Then restart pyos pod
kubectl delete pod -l run=pyos-od -n abcdesktop\n
You should read on stdout
pod \"pyos-od-5586b88767-mrf28\" deleted\n
"},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":"ctr
command preinstalled .nodejs
and npm command preinstalled.docker
command preinstalled.xterm
. xterm program is a terminal emulator for the X Window System. The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps
git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n
And install nodejs
packages for oc.apps
npm install\n
"},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"abcdesktop uses a json file description to build an application.
Create a sample.json
file
{\n \"tag\": \"3.0\",\n \"acl\": { \"permit\": [ \"all\" ] },\n \"cat\": \"development\",\n \"icon\": \"small.svg\",\n \"apkpackage\": \"xterm\",\n \"keyword\": \"xterm,shell,cmd\",\n \"launch\": \"xterm.XTerm\",\n \"name\": \"Xterm\",\n \"path\": \"/usr/bin/xterm\",\n \"rules\": { \"homedir\": { \"default\": true } },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
"},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile
from the sample.json
file","text":"make.js
is a command line for abcdesktop. make.js
read a json file and create a Dockerfile
The make.js
options are :
-r 3.0
: to build image in abcdesktop 3.0 format-d True
: to create a Dockerfile
as output-f sample.json
: file to read as inputnpm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities
node make.js -r 3.0 -d True -f sample.json\n
Your read on stdout.
Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n acl: { permit: [ 'all' ] },\n cat: 'development',\n icon: 'small.svg',\n apkpackage: 'xterm',\n keyword: 'xterm,shell,cmd',\n launch: 'xterm.XTerm',\n name: 'Xterm',\n path: '/usr/bin/xterm',\n rules: { homedir: { default: true } },\n template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n
Read the Dockerfile
cat Dockerfile\n
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
"},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0
from Dockerfile","text":"docker build -t abcsample:3.0 .\n
Sending build context to Docker daemon 44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
"},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0
","text":"abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.
In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.
Export the image to OCI image format
docker save abcsample:3.0 -o abcsample.tar\n
Import abcsample into the namespace k8s.io
using ctr
ctr -n k8s.io images import abcsample.tar\n
unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
"},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0
in to abcdesktop","text":"Export the abcsample:3.0 image to OCI format
docker image inspect abcsample:3.0 > abcsample.json\n
Import the abcsample.json
into abcdesktop endpoint /API/manager/image
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n
Return a json document
[\n {\n \"home\": null,\n \"cmd\": [\n \"/composer/appli-docker-entrypoint.sh\"\n ],\n \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n \"id\": \"abcsample:3.0\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"launch\": \"xterm.XTerm\",\n \"name\": \"Xterm\",\n \"icon\": \"small.svg\",\n \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n \"keyword\": \"xterm,xterm,shell,cmd\",\n \"uniquerunkey\": null,\n \"cat\": \"development\",\n \"args\": null,\n \"execmode\": null,\n \"security_opt\": null,\n \"showinview\": null,\n \"displayname\": \"Xterm\",\n \"mimetype\": [],\n \"path\": \"/usr/bin/xterm\",\n \"desktopfile\": null,\n \"executablefilename\": \"xterm\",\n \"usedefaultapplication\": null,\n \"fileextensions\": [],\n \"legacyfileextensions\": [],\n \"host_config\": {},\n \"secrets_requirement\": null,\n \"run_inside_pod\": false,\n \"image_pull_policy\": \"IfNotPresent\",\n \"image_pull_secrets\": null\n }\n]\n
"},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"Open a web browser and go to abcdesktop service url.
Open a new abcdesktop session.
Look for your new application xterm
Start your new application xterm
The icon of then new application xterm is a green rect. It appears in the dock.
Logoff to free ressources.
You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json
it describe all json applications for abcdesktop.
To rebuild all application in applist.json
, run node make.js -r 3.0
node make.js -r 3.0\n
This command has create new '.d' files.
$ ls *.d\nls *.d\nalpine-2048.d calculator.d drawio.d flare.d hyper.d kturtle.d octave.d remotedesktopmanager.d terminal.d winefile-wine.d youtube.d\napachedirectorystudio.d chess.d edge.d frozen-bubble.d impress.d leocad.d onlyoffice.d rhythmbox.d terminalpod.d winemine-wine.d\nastromenace.d chrome.d elementary.terminal.d gcompris.d inkscape.d librecad.d openshift.d robots.d tetravex.d winhelp-wine.d\natom.d chromium.d eog.d gedit.d kalzium.d mahjongg.d pinta.d shotcut.d thunderbird.d winscp-wine.d\nbase.d citrix.d evince.d gelemental.d kdiamond.d math.d planner.d stellarium.d ubuntu-2048.d wireshark.d\nbeekeeperstudio.d cloudfoundry.d evolution.d geogebra.d kgeography.d mathwar.d postman.d step.d vice.d writer.d\nblender.d cntlm.d file-roller.d gimagereader.d kigo.d minecraft.d putty-unix.d stress.d vlc.d xedit.d\nbless.d corsix-th.d filelight.d gimp.d klickety.d mines.d putty-wine.d sublime-text.d vmmacos.d xeyes.d\nblobby.d dia.d filezilla.d gnumeric.d klotski.d nautilus.d qelectrotech.d supertux2.d vmrc.d xman.d\nbrackets.d doom.d firefox-esr.d golly.d konsole.d notepad-wine.d remarkable.d swell-foop.d vmubuntu.d xpad.d\ncalc.d draw.d firefox.d gretl.d ksquares.d notepadqq.d remmina.d teams.d vscode.d xterm.d\n
Each .d
file is a Dockerfile
Run make
to build all applications (it can take more than 2 hours)
make\n
"},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"All auth providers support rules configuration
A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )
"},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"A rule is a dictionary object with :
Example :
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
"},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"conditions
is a list of condition. All condition are always tested, as a logical AND
. The result must be equal to the expected
value.
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnet80'\n}\n
Add the labels 'shipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : False,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnonet80', if the 'expected' value is False
To test if the user source IP address is in the subnet to 80.0.0.0/8
AND
is NOT
a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : True },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : False } ], \n 'expected' : True,\n 'label': 'noshipcrewandnet80'\n}\n
Add the labels 'noshipcrewandnet80', if the 'expected' value is True
To test if the user source IP address is NOT
in the subnet to 80.0.0.0/8
AND
is a memberOf
ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
'rule-sample': { 'conditions': [ \n { 'network': '80.0.0.0/8', 'expected' : False },\n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewandnonet80'\n}\n
Add the labels 'shipcrewandnonet80', if the 'expected' value is True
This condition is a dummy condition; Only use to force a label or to disable a test.
'boolean': boolean\n
The commun usage is
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'dummy'\n}\n
or alway False
'rule-dummy': { 'conditions': [ { 'boolean': True, 'expected' : True } ],\n 'expected' : False,\n 'label': 'dummy'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"This condition is test if a HTTP Header value is equal to a string.
'httpheader': dict\n
example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'
\n 'rule-httpheader': { \n 'conditions' : [ \n { 'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n 'expected' : True } ],\n 'expected' : True,\n 'label': 'chromemaxosx112' }\n\n
"},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.
'network': string\n
example
To test if the user source IP address is equal to 8.8.8.1/32
'rule-home': { \n 'conditions' : [ { 'network': '8.8.8.1/32', 'expected' : True } ],\n 'expected' : True,\n 'label': 'homeipsource' }\n
To test if the user source IP address is in the subnet 10.0.0.0/8
'rule-localnet': { \n 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ],\n 'expected' : True,\n 'label': 'localnet' }\n
To test if the user source IP address is NOT in the subnet 192.168.0.0/24
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : False } ],\n 'expected' : True,\n 'label': 'no192168net' }\n
same as
'rule-localnet': { \n 'conditions' : [ { 'network': '192.168.0.0/24', 'expected' : True } ],\n 'expected' : False,\n 'label': 'no192168net' }\n
"},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork
a separated rule.
'policies': {\n 'acl' : {},\n 'rules' : { \n 'rule-privatenetwork-10': { 'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' },\n 'rule-privatenetwork-fe80':{ 'conditions' : [ { 'network': 'fe80::/10', 'expected' : True } ], \n 'expected' : True, \n 'label': 'privatenetwork' }\n }\n} \n
"},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"This condition test if the user is a member of a LDAP Distinguished Name.
'memberOf': string\n
'rule-sample': { 'conditions': [ \n { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], \n 'expected' : True,\n 'label': 'shipcrewgrp'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.
'primarygroupid': string\n
To check is a user is memberof a DOMAIN\\USER
the primary group id is 513
'rule-domainuser': { 'conditions': [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label': 'domainuser'\n}\n
However, if the user needed to be seen as a Domain Admin for POSIX
, the PrimaryGroupID
is 512
, the RID for that group.
'rule-posixdomainadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'posixdomainadmin'\n}\n
The Enterprise Admins group
, 519
, is also used to grant this level in POSIX.
'rule-enterpriseadmin': { 'conditions': [ { 'primarygroupid': '519', 'expected' : True } ],\n 'expected' : True,\n 'label': 'enterpriseadmin'\n}\n
"},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"The authentification configuration is set in the od.config
file. In this chapter you will need to update the od.config
configuration file. This update differs depending on the configuration docker mode or kubernetes mode.
Read the Update your configuration file and apply the new configuration file section to make change in od.config
file for kubernetes cluster.
The authmanagers is defined as a dictionary object :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
The od.config
defines four kinds of entries in the authmanagers
object :
external
: use for OAuth 2.0 Authentificationexplicit
: use for LDAP, LDAPS and ActiveDirectory Authentificationmetaexplicit
: use Microsoft Active Directory Trusted relationship, with support of FSP (Foreign Security Principals)implicit
: use for Anonymous Authentification and SSL-client certificat external
For OAuth 2.0 authentification metaexplicit
For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit
For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit
For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"You should have read the hands-on :
od.config
file for kubernetes cluster.Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit
, explicit
, and external
, as describe :
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { }\n}\n
Save your new od.config
file, and restart the pyos pod
Start your web browser and open the URL http://localhost:30443
The Web home page should only show the title abcdesktop.io. There is no authmanagers
available.
Great you can now add some value to authenticate your users.
"},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagersimplicit
:","text":"implicit
is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.
explicit
:","text":"explicit
is defined to use a directory service like LDAP. Read the authmanagers explicit Section.
metaexplicit
:","text":"metaexplicit
offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.
external
:","text":"external
use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.
In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.
You can set a complete authmanagers
dictionary as described with external
, explicit
and implicit
authmanagers: {\n 'external': {\n 'providers': {\n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n },\n 'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx', \n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n },\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n },\n 'github': {\n 'displayname': 'Github',\n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'read:user' ], \n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=github',\n 'authorization_base_url': 'https://github.com/login/oauth/authorize',\n 'token_url': 'https://github.com/login/oauth/access_token',\n 'userinfo_url': 'https://api.github.com/user',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n }\n },\n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n },\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n }}\n\n\nadconfig : { \n 'AD': { \n 'default' : True, \n 'ldap_timeout': 15,\n 'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n 'domain': 'AD',\n 'auth_type': 'KERBEROS',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'krb5_conf': '/etc/krb5.conf',\n 'servers' : [ 'ldap://192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n 'auth_protocol' : { \n 'ntlm': True, \n 'cntlm': False, \n 'kerberos': True, \n 'citrix': False, \n 'localaccount': True },\n 'query_dcs' : False } } }\n
"},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit
for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers
dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}
"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN
and defined in the config_ref
with the exact same value.
Providers :
The provider is formated as a dictionnary
{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The adconfig is a dictionnary. For example :
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
If this example, the Microsoft Active Directory value are set to :
Variable name Value for exampleUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Type Description Exampledefault
boolean Use this domain as default domain True ldap_basedn
string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local
domain_fqdn
string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL
servers
list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
The explicit
authentification is support LDAP
and LDAPS
bind.
The Microsoft Active Directory value are set to :
Variable name ValueUSERDOMAIN
AD
USERDNSDOMAIN
AD.DOMAIN.LOCAL
For Active Directory authmanagers, replace the variable name with your own value.
Variable name Description Exampleldap_basedn
Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local
ldap_fqdn
Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local
domain_fqdn
Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL
servers
Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]
kerberos_realm
Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL
"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)
"},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.
Variable name Type Defautl valuesite_subnetdn
string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )
site_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=subnet)
site_attrs
list ['cn', 'siteObject', 'location']
"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location
is the join key to match local printer for the user.
printer_printerdn
string OU=Applications + config.get('basedn')
printer_scope
ldap python ldap.SCOPE_SUBTREE
read Python ldap reference for more details site_filter
string (objectClass=printQueue)
site_attrs
list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]
Great, you have check how the explicit Authentification configuration works.
"},{"location":"3.0/config/authexplicit-ldap/","title":"Authentificationexplicit
for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit
object","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'LDAP': { \n 'config_ref': 'ldapconfig', \n 'enabled': True\n }\n}\n
In this example, ldapconfig
dict must have a key LDAP
show_domains
boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain
string not used by ldap, only used by Active Directory providers
dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}
"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"The provider
authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref
.
Providers :
The provider is formated as a dictionnary
{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }
USERDOMAIN
configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig'
, where key
is config_ref
and value
is the dictionnay variable name. enable boolean enable or disable the domain entry The ldapconfig is a dictionnary.
For example :
ldapconfig : { 'planet': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://192.168.8.195' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n }}\n\n}\n
"},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default
boolean Use this domain as default domain True tls_require_cert
boolean The default value is False. tls_require_cert
apply only if ldap server URI starts with ldaps
. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True
This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
False basedn
string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com
servers
list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ]
IP Address or FQDN values scope
LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope
being one of SCOPE_BASE
(to search the object itself), SCOPE_ONELEVEL
(to search the object\u2019s immediate children), or SCOPE_SUBTREE
(to search the object and all its descendants). ldap.SCOPE_SUBTREE
timeout
integer ldap time out in second 10 exec_timeout
integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou
string Users Organisation Unit ou=people,dc=planetexpress,dc=com
attrs
list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter
string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))
group_filter
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
group_attrs
string LDAP filter to find group object (&(objectClass=Group)(cn=%s))
"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"The authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
The basedn
is dc=planetexpress,dc=com
The admin account is described as
Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"ou=people,dc=planetexpress,dc=com
Start your web browser and open the URL http://localhost
The Web home page contains the new input values Login
and Password
to authenticate this user.
You can use for example on user of the list above.
Credentials Value Login Turanga Leela Password leelaInsert the login credentials :
Turanga Leela
as login and leela
as password, then click on the Sign in
button.
Look at the top of the sreen. The user name is Turanga Leela
:
Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :
I like this amazing project abcdesktop.io\n
Do not save your file and just close your web browser.
Start your web browser again, and open the same URL http://localhost
, and log in with the same account: Turanga Leela
as login and leela
as password, then click on the Sign in
button.
The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io
All applications are maintained.
Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.
"},{"location":"3.0/config/authexplicit/","title":"Authentificationexplicit
","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit
:","text":"explicit
authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.
The explicit
authentification configuration is defined as a dictionnary object and contains an explicit
provider.
The explicit
authentification support the directory services ldap
, ldaps
, and Microsoft Active Directory
.
Configuration sample for Microsoft Active Directory
For example :
'explicit': {\n 'show_domains': True,\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n}\n
adconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn': 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'query_dcs' : True,\n 'wins_servers' : [ '192.168.1.12' ],\n 'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n }\n}\n
"},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"If the authmanagers explicit
is enabled. The Web home page insert the new input values Login
and Password
to authenticate this user.
Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers
"},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers
Great, you have check how the explicit Authentification configuration works.
"},{"location":"3.0/config/authexternal/","title":"Authentificationexternal
","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"To use external
Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.
abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.
"},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagersexternal
:","text":"external
authentification use OAuth 2.0 authenticaton.
The external
authentification configuration is defined as a dictionary object and contains a list of external
provider.
Sample providers entry using the Google OAuth 2.0 authentification service.
'external': {\n 'providers': {\n 'google': { \n 'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n } \n }\n}\n
The variable values client_id
and client_secret
have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local
is referred to your public server FQDN.
displayname
string Display Name show in Web front Google
enabled
boolean LDAP Base Distinguished Names True
client_id
string client id XXX-YYY.apps.googleusercontent.com
client_secret
string client secret XXX
scope
list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]
userinfo_url
string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix
string redirect URL https://hostname.domain.local/API/auth/oauth
redirect_uri_querystring
string URL query string manager=external&provider=google
authorization_base_url
string callback URL https://accounts.google.com/o/oauth2/v2/auth
token_url
string token URL https://oauth2.googleapis.com/token
The complete redirect url concats the two values redirect_uri_prefix
and redirect_uri_querystring
.
Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.
"},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section
'orange': { \n 'displayname': 'Orange', \n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'openid', 'form_filling' ],\n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=orange',\n 'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n 'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n 'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"Facebook's OAuth is supported for authentication.
"},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API
'facebook': { \n 'displayname': 'Facebook', \n 'enabled': True,\n 'userinfo_auth': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx', \n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=facebook',\n 'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n 'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n 'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n 'userinfomap': {\n '*': '*',\n 'picture': 'picture.data.url'\n },\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.
"},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]
'google': { \n 'displayname': 'Google', \n 'enabled': True,\n 'client_id': 'xxxx', \n 'client_secret': 'xxxx',\n 'userinfo_auth': True,\n 'scope': [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ],\n 'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=google',\n 'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n 'token_url': 'https://oauth2.googleapis.com/token',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
"},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.
"},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API
'github': {\n 'displayname': 'Github',\n 'enabled': True,\n 'basic_auth': True,\n 'userinfo_auth': True,\n 'scope' : [ 'read:user' ], \n 'client_id': 'xxxx',\n 'client_secret': 'xxxx',\n 'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n 'redirect_uri_querystring': 'manager=external&provider=github',\n 'authorization_base_url': 'https://github.com/login/oauth/authorize',\n 'token_url': 'https://github.com/login/oauth/access_token',\n 'userinfo_url': 'https://api.github.com/user',\n 'policies': { 'acl' : { 'permit': [ 'all' ] } }\n }\n
Great, you have check how the implicit Authentification configuration works.
"},{"location":"3.0/config/authimplicit/","title":"Authentificationimplicit
","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit
:","text":"implicit
is the easyest configuration mode, and is used as 'Anonymous' authentification.
The provider is defined as a dictionnary object and contains an anononymous
provider.
anononymous
provider always permit authentification, and create a uuid as userid. anononymous
provider is used to skip the authentification process in a demonstration mode.
'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n
anononymous
provider always permit authentification, and create a uuid as userid.
Set in your configuration file the authmanagers dictionnary as described
authmanagers: {\n 'external': { },\n 'explicit': { },\n 'implicit': { \n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Anonymous',\n 'userid': 'anonymous',\n 'username': 'Anonymous'\n } \n }\n}\n
Update your configuration file and apply the new configuration file
Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :
Press the Sign-In Anonymously
button.
Then, choose the settings
in the menu at the upper right corner
Choose the System
in the settings control panel.
Then choose User containers
This screen show you the hostname
.
You can read the hostname. In the example the hostname is f097ab7aac57
, from the container id.
Using a shell, run the command docker ps -a
docker ps -a\n
Find a running container with the containerid previously identified.
In this example the containerid is f097ab7aac57
f097ab7aac57 abcdesktopio/oc.user.18.04 \"/composer/docker-en\u2026\" 8 minutes ago Up 8 minutes 4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp g-06b686a5-c98d-4889-b73d-3455f692e6c2\n
Run the command docker inspect CONTAINERID
, replace the string CONTAINERID with your container id value.
For example docker inspect f097ab7aac57
docker inspect f097ab7aac57\n
Locate the Mounts
description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and
\"Mounts\": [\n {\n \"Type\": \"volume\",\n \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/tmp\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n },\n {\n \"Type\": \"volume\",\n \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n \"Destination\": \"/home/balloon\",\n \"Driver\": \"local\",\n \"Mode\": \"z\",\n \"RW\": true,\n \"Propagation\": \"\"\n }\n ],\n\n
When the anonymous container is removed, the anonymous home directory is deleted.
Great, you have check how the implicit Authentification configuration works.
"},{"location":"3.0/config/authmetaexplicit/","title":"Authentificationmetaexplicit
for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit
object","text":"The metaexplicit
authentification manager contains only one provider. The provider must be defined as metadirectory
.
'metaexplicit': {\n 'providers': {\n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True\n }\n}\n
Variable name Type Description providers
dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}
"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory
provider configuration","text":"The metadirectory
provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref
.
A metadirectory
provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut
.
coporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } } \n
Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description
value to get the user's trusted domain.
For example :
description: AD\\john\n
Then pyos look for provider AD
configuration and process authentification on domain AD
The metadirectory
accounts can be disabled. The ldap attribut userAccountControl
is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE
set or not.
A service account must defined for a metadirectory
provider. The service account is used to bind the metadirectory.
metadirectory
provider and active directory user domain","text":"The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut
authmanagers: {\n #\n # define the meta explicit manager\n # This is the trusted external forest for the followed domain\n #\n 'metaexplicit': {\n 'providers': {\n # define the metadirectory provider\n # only one metadirectory provider is supported \n 'metadirectory': { \n 'config_ref': 'coporateconfig', \n 'enabled': True } \n }\n },\n\n # \n # define the Active Directory provider for each DOMAIN\n # define two domains in two disctinct forest with a trust relationship \n # \n 'explicit': { \n # define an Active Directory provider AD \n 'AD': { 'config_ref': 'adconfig', 'enabled': True },\n # define an Active Directory provider ANOTHER\n 'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True } \n }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': { \n 'domain' : 'CORPORATE',\n 'ldap_basedn' : 'DC=foo,DC=corporate,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.foo.corporate.local',\n 'servers' : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n # join_key_ldapattribut must be defined for a metadirectory provider\n 'join_key_ldapattribut' : 'description',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn': 'foo.corporate.local',\n 'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n # serviceaccount must be defined for a metadirectory provider\n 'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': { 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'auth_type' : 'NTLM',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n 'ldap_basedn' : 'DC=another,DC=super,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.another.super.local',\n 'domain' : 'ANOTHER',\n 'auth_type' : 'KERBEROS',\n 'domain_fqdn' : 'ANOTHER.SUPER.LOCAL',\n 'servers' : [ 'ldap://192.168.10.12' ],\n 'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectory
support","text":"metadirectory
support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory
support isMemberOf
on foreign security principal.
The user's SID
of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.
The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )
To get more information about foreign security principal (FSP), read :
Foreign Security Principals Container
Active Directory: Foreign Security Principals and Special Identities
balloon
is the default generic user.
The balloon
user is created inside the oc.user container
The default values are
balloon Default Valuesname
balloon
uid
4096
gid
4096
homedirectory
/home/balloon
If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :
ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":"Replace type: NodePort
by type: LoadBalancer
into the nginx service
Save this yaml as nginx.service.http.loadbalancer.yaml
file name
kind: Service\napiVersion: v1\nmetadata:\n name: nginx\n namespace: abcdesktop\nspec:\n type: LoadBalancer\n selector:\n run: nginx-od \n ports:\n - protocol: TCP\n port: 80\n targetPort: 80\n name: http\n
# delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n
Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service
kubectl get services -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 57m\nmemcached ClusterIP 10.245.247.50 <none> 11211/TCP 57m\nmongodb ClusterIP 10.245.198.243 <none> 27017/TCP 57m\nnginx LoadBalancer 10.245.172.53 <pending> 80:30443/TCP 57m\nopenldap ClusterIP 10.245.109.131 <none> 389/TCP,636/TCP 57m\npyos ClusterIP 10.245.94.15 <none> 8000/TCP 57m\nspeedtest ClusterIP 10.245.67.168 <none> 80/TCP 57m\n
You get the EXTERNAL-IP
for your LoadBalancer
service
kubectl get services -n abcdesktop\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 61m\nmemcached ClusterIP 10.245.247.50 <none> 11211/TCP 61m\nmongodb ClusterIP 10.245.198.243 <none> 27017/TCP 61m\nnginx LoadBalancer 10.245.172.53 161.35.246.4 80:30443/TCP 61m\nopenldap ClusterIP 10.245.109.131 <none> 389/TCP,636/TCP 61m\npyos ClusterIP 10.245.94.15 <none> 8000/TCP 61m\nspeedtest ClusterIP 10.245.67.168 <none> 80/TCP 61m\n
Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4
Login using Philip J. Fry
And you should get the fry
desktop
port-forward
","text":"Use the kubectl port-forward
command and a forwarded local port to help troubleshooting issues.
Get the pod name for nginx
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-69fb8fd8bb-qg4z2 1/1 Running 0 11h\n
Choose the nginx's pod, to forward local port 80 to nginx 80
kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n
Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80
Then open your web browser http://localhost
, you should get the home page, login using LDAP auth
or Anonymous auth
should work.
Then login, and you get a pod user.
For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.
kubectl get pods -n abcdesktop \nNAME READY STATUS RESTARTS AGE\nmemcached-od-bdcbbcb74-nhd68 1/1 Running 0 11h\nmongodb-od-d46d79476-fmbj5 1/1 Running 0 11h\nnginx-od-69fb8fd8bb-qg4z2 1/1 Running 0 11h\nopenldap-od-795c55f6db-wz7l4 1/1 Running 0 11h\npyos-od-988887859-8kwdx 1/1 Running 0 11h\nspeedtest-od-6b5f8584f5-cs69t 1/1 Running 0 11h\nfry-2cf3a 4/4 Running 0 4m15s\n
The user fry
gets the abcdesktop pod fry-2cf3a
This example works on digitalocean cloud provider.
First of all, you need to get your loadbalancer-certificate-id
To list available certificates and their IDs, install doctl and run the command
doctl compute certificate list\n
Then define annotations
on the abcdesktop nginx service like
service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n
Create a loadbalancing.yaml
file, to update the default abcdestkop service/nginx
You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id
with your own certificate value.
--- \nkind: Service \napiVersion: v1\nmetadata: \n name: nginx \n namespace: abcdesktop\n annotations:\n service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n labels:\n abcdesktop/role: nginx\nspec: \n type: LoadBalancer\n selector:\n run: nginx-od\n ports:\n - protocol: TCP\n port: 443\n targetPort: 80\n name: https\n---\n
Apply the new loadbalancing.yaml
file
kubectl apply -f loadbalancing.yaml\n
You can read
service/nginx configured\n
Check the nginx/services
kubectl get service/nginx -n abcdesktop\n
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nnginx LoadBalancer 10.245.188.146 161.35.246.4 443:32086/TCP 28m\n
Now you can replace http
by the secure protocol https
abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.
List of all abcdesktop's controllers and the description :
Controller DescriptionAccountingController
accounting data json format AuthController
authenticate user ComposerController
CRUD main services (like createDesktop, createApplication) CoreController
get configuration and user message info ManagerController
manage service (like add an application) UserController
retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"The controllers
configuration is a dictionary, and is defined in the pyos's od.config
file.
controllers : { \n 'AccountingController': { \n 'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'ManagerController': { \n 'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n 'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n },\n 'AuthController' : { 'permitip': None },\n 'ComposerController' : { 'permitip': None },\n 'CoreController' : { 'permitip': None },\n 'UserController' : { 'permitip': None }\n} \n
By default, AccountingController
and ManagerController
access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.
By default, others controllers access is enabled, without any restriction.
"},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller
name and with entries permitip
and/or apikey
.
permitip
is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]
. If permitip
is not set or if the controller
is not defined, filtering features is disabled.apikey
is a list of string, for example [ 'fPCdPSSj8gZri1Ncmg', 'Z9pXCa2y6ccDeBBeeUc4' ]
. If apikey
is not set or the controller
not defined, filtering features is disabled. The http header value is X-API-Key
If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden
{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key
","text":"Add the http header X-API-Key: fQDbvjCafec4l
to the curl command to list images
curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n
The command returns
{}\n
Add the http header X-API-Key: fQDbvjCafec4l
to the curl command to add new application
curl -X POST -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n
The command returns
[\n { \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n \"path\": \"/usr/bin/xeyes\", \n \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n \"id\": \"abcdesktopio/xeyes.d:3.0\", \n \"rules\": {}, \n \"acl\": {\"permit\": [\"all\"]}, \n \"launch\": \"xeyes.XEyes\", \n \"name\": \"xeyes\", \n \"icon\": \"circle_xfce4-eyes.svg\", \n \"keyword\": \"xeyes,eyes\", \n \"uniquerunkey\": null, \n \"cat\": \"utilities\", \n \"args\": null, \n \"execmode\": null, \n \"showinview\": null, \n \"displayname\": \"xeyes\", \n \"home\": null, \n \"desktopfile\": null, \n \"executeclassname\": null, \n \"executablefilename\": \"xeyes\", \n \"usedefaultapplication\": false, \n \"mimetype\": [], \n \"fileextensions\": [], \n \"legacyfileextensions\": [], \n \"secrets_requirement\": null, \n \"image_pull_policy\": \"IfNotPresent\", \n \"image_pull_secrets\": null, \n \"containerengine\": \"ephemeral_container\", \n \"securitycontext\": {}\n }\n]\n
"},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n
The command returns
{\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
"},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"The od.config contains options to describe how the oc.user and applications containers have to be created.
"},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"All desktop options are defined in od.config file. Desktop options start with the prefix desktop.
, then add the name of the option.
desktop.defaultbackgroundcolors
list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype
string 'hostPath' desktop.remotehomedirectorytype
list [] desktop.persistentvolumespec
string None desktop.persistentvolumeclaimspec
string None desktop.homedirectorytype
string 'hostPath' desktop.envlocal
dictionary { 'X11LISTEN':'tcp'}
desktop.nodeselector
dictionary {}
desktop.username
string 'balloon' desktop.userid
integer 4096 desktop.groupid
integer 4096 desktop.userhomedirectory
string '/home/balloon'
desktop.useinternalfqdn
boolean False desktop.uselocaltime
boolean False desktop.policies
dictionary { 'rules':{}, 'max_app_counter':5 }
desktop.webhookdict
dictionary {}
"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"This option describes how to create the home directory for the user. The value can be defined as :
'None'
: no dedicated volume is created, the oc.user container use an emptyDir': { 'medium': 'Memory'}
. All user data will be removed at logout.'hostPath'
: set a dedicated 'hostPath' volume, the user's container and applications share this volume. User home data are persistent.'persistentVolumeClaim'
: set a dedicated 'persistentVolumeClaim' volume, the user's container and applications share this volume. User home data are persistent.To get more information about user's home directory volume, read the volumes chapter
"},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]
For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.
If desktop.remotehomedirectorytype
contains 'cifs' and if the authentification provider get homeDrive
and homeDirectory
attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive
value, and mounted to homeDirectory
.
The desktop.defaultbackgroundcolors
allow you to change the default background color.
The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]
The desktop.defaultbackgroundcolors
length can contain up to 8 entries. To see the color
Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Connect with Anonymous access, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
You should see the default background colors, for example :
"},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"desktop.envlocal
is a dictionary. desktop.envlocal
contains a (key,value) added as environment variables to oc.user.
The default value is :
{ \n 'X11LISTEN': 'tcp'\n}\n
"},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTEN
tcp
permit X11 to listen on tcp port, default is udp
ABCDESKTOP_RUN_DIR
/var/run/desktop
directory to write pid services ABCDESKTOP_LOG_DIR
/var/log/desktop
directory to write log files services DISABLE_REMOTEIP_FILTERING
disabled
disabled remote ip filtering inside pod user, default is disabled
, change to enabled
to remove core ip filtering SET_DEFAULT_WALLPAPER
myfile.jpeg
name of file to set the user wallpaper, this file must exist in ~/.wallpapers
SET_DEFAULT_COLOR
#6EC6F0
Value of default colour saved in file ~/.store/currentColor
SENDCUTTEXT
enabled
\u00a0Send clipboard changes to user. Set value to disabled
to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext
if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}
. The default value is enabled
ACCEPTCUTTEXT
enabled
\u00a0Accept clipboard updates from user. Set value to disabled
to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext
if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}
. The default value is enabled
"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"desktop.nodeselector
is a dictionary. This option permits to assign user pods to nodes.
It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.
The value must be a string, by example 'true', and matches the labels node value.
desktop.nodeselector: { 'abcdesktopworker': 'true' }\n
To set a label abcdesktopworker=true
to a node
kubectl label node $YOUR_NODE abcdesktopworker=true\n
The commands returns
node/nodesample01 labeled\n
To list all labels on all nodes
kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n
The commands returns
map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n
desktop.nodeselector
is used as selector by pyos to create user's pods and to pull container's images.
desktop.username
is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.
desktop.userid
describes the uid Number
of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.
desktop.groupid
describes the gid Number
of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.
desktop.userhomedirectory
describes the homedirectory
of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory
is string. The default value is /home/balloon
.
The desktop.uselocaltime
is boolean, to use host value of /etc/localtime
. The default value is False
. If desktop.uselocaltime
is True, this add a volume mapping from host file /etc/localtime
to container file /etc/localtime
.
desktop.policies
has a dictionary format.
max_app_counter
limit applications counter, without checking the docker container status rules
rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }
acl
allow or denied desktop creation Example
desktop.policies: { \n 'rules': { \n 'volumes': { \n 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n 'Mygroupteam': { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n } \n },\n 'acls' : {},\n 'max_app_counter' : 4 \n}\n
"},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"desktop.webhookdict is a dictionary to add key/value to the command create
and destroy
in rules objects.
WARNING desktop.desktopuseinternalfqdn
is an experimental feature, keep this value to False in production
desktop.desktopuseinternalfqdn
describes the content of the payload data in the JWT Desktop Token. The default value is False
.
Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False
the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True
the payload data in the JWT Desktop Token contains the FQDN of the user Pod.
If you CAN NOT add endpoint_pod_names
in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn
to False
. This choice is less secure.
To set desktop.desktopuseinternalfqdn
to True
value, you have to update the coredns
ConfigMap.
kind: ConfigMap\napiVersion: v1\nmetadata:\n name: coredns\n namespace: kube-system\ndata:\n Corefile: |\n .:53 {\n log\n errors\n health\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n endpoint_pod_names\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n transfer to * \n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf\n cache 30\n loop\n reload\n loadbalance\n }\n
"},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.
For example
printer
is a service. printer
service runs inside the user pod. graphical
is a service. graphical
service runs inside the user pod and is the default service.init
contains init command for user podgraphical
is the user graphical service (X11 and VNC)spawner
is the command service for graphical servicebroadcast
is the broadcast service for graphical servicewebshell
is the web socket bash shell service for graphical serviceprinter
is the printer service (cupsd)printerfile
is the file service to download generated PDF file (this file transfert service is dedicated for printer service)sound
is the sound service (pulseaudio) to send rtp stream from a container to the web browser via janus webrtc gatewayfiler
is the filer service to upload and download file into the user home directorystorage
contains abcdesktop user secrets, like Kerberos, NTLM hashes, VNC password.Each service :
'enable': True
'resources'
limits resources for a container'acl'
to start or not using rules 'securityContext'
or use the spec securityContext
'secrets_requirement
, a list of secrets to run example ['abcdesktop/vnc', 'abcdesktop/kerberos']
desktop.pod : { \n 'spec' : {\n 'shareProcessNamespace': True,\n 'shareProcessMemory': True,\n 'shareProcessMemorySize': '256Mi',\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ],\n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True\n }\n }, \n 'graphical' : { \n 'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'acl': { 'permit': [ 'all' ] },\n 'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n 'resources': { \n 'requests': { 'memory': \"320Mi\", 'cpu': \"250m\" }, \n 'limits': { 'memory': \"1Gi\", 'cpu': \"1000m\" } \n },\n 'shareProcessNamespace': True,\n 'tcpport': 6081,\n 'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n },\n 'spawner' : { \n 'enable': True,\n 'tcpport': 29786,\n 'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n 'acl': { 'permit': [ 'all' ] } \n },\n 'broadcast' : { \n 'enable': True,\n 'tcpport': 29784,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'webshell' : { \n 'enable': True,\n 'tcpport': 29781,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'printer' : { \n 'image': 'abcdesktopio/oc.cupsd:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 681,\n # cupsd need to start as root\n 'securityContext': { 'runAsUser': 0 },\n 'resources': { \n 'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" }, \n 'limits' : { 'memory': \"512Mi\", 'cpu': \"500m\" } \n },\n 'acl': { 'permit': [ 'all' ] } \n },\n 'printerfile' : { \n 'enable': True,\n 'tcpport': 29782,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'filer' : { \n 'image': 'abcdesktopio/oc.filer:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 29783,\n 'acl': { 'permit': [ 'all' ] } \n },\n 'storage' : { \n 'image': 'k8s.gcr.io/pause:3.8',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': True,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"32Mi\", 'cpu': \"100m\" }, \n 'limits' : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n }\n },\n 'sound': { \n 'image': 'abcdesktopio/oc.pulseaudio:3.0',\n 'imagePullPolicy': 'IfNotPresent',\n 'enable': False,\n 'tcpport': 4714,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"8Mi\", 'cpu': \"50m\" }, \n 'limits' : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n } \n },\n 'init': { \n 'image': 'busybox',\n 'enable': True,\n # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n 'imagePullPolicy': 'IfNotPresent',\n 'securityContext': { 'runAsUser': 0 },\n 'acl': { 'permit': [ 'all' ] },\n 'command': [ 'sh', '-c', 'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n },\n 'ephemeral_container': {\n 'enable': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}'\n },\n 'acl': { 'permit': [ 'all' ] }\n },\n 'pod_application' : {\n 'enable': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}'\n },\n # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n 'acl': { 'permit': [ 'all' ] } } }\n\n
"},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"A container is added to the user pod if 'enable': True
The container is added to the user pod if acl
matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.
The image use the kubernetes pull policy values :
IfNotPresent
the image is pulled only if it is not already present locally.Always
kubelet queries the container image registry to resolve the name to an image digest.Never
the kubelet does not try fetching the image. If the image is somehow already present locally, the kubelet attempts to start the container; otherwise, startup fails. Read the pullpolicy kubernetes documentation to get more details.
"},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"waitportbin
is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport
value.
The command is run with parameters :
/composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
"},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"waitportbintimeout
is the timeout in seconds to get waitportbin
command result.
Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0'
)
The imagePullSecret
entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret
is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.
imagePullSecret : [ { 'name': name_of_secret } ]\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
The imagePullSecret
become in this sample
imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
"},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.
"},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"spec
entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.
{{ uidNumber }}
is replaced by the user's uidNumber
on ldap if the objectClass is posixAccount or if not set by the default user id set in option desktop.userid
{{ gidNumber }}
is replaced by the user's gidNumber
on ldap if the objectClass is posixAccount is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
{{ supplementalGroups }}
is replaced by the list of groups gidNumber
is posixGroup
shareProcessNamespace
When process namespace sharing is enabled, processes in a container are visible to all other containers in the same pod. Read the kubernetes shareProcessNamespace details, to get more details.
shareProcessMemory
Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries. POSIX shared memory requires that a tmpfs be mounted at /dev/shm. Containers in a pod do not share their mount namespaces so we use volumes to provide the same /dev/shm into each container in a pod. Read shared_memory to get more details. Shared memory is defined as an emptyDir volume { 'name': 'shm', { 'medium': 'Memory', 'sizeLimit': shareProcessMemorySize } }
minted on /dev/shm
. Only ephemeral container application can share memory with the X11 server. To get more details about POSIX and UNIX System V shared memory objects, read the podshmtest repository.
shareProcessMemorySize
is the size of shareProcessMemory
. The size is set to the shm
volume 'sizeLimit': shareProcessMemorySize
'spec' : {\n 'shareProcessNamespace': True,\n 'shareProcessMemory': True,\n 'shareProcessMemorySize': '256Mi',\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ],\n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True\n }\n
"},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }
.
The command support {{ }}
values. Values can be
'{{ uidNumber }}'
'{{ gidNumber }}'
'{{ uid }}'
Values are read from the previous ldap authentification.
'{{ uidNumber }}'
is replaced by the ldap uidNumber
or if not set by the default user id set in option desktop.userid
'{{ gidNumber }}'
is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
'{{ uid }}'
is replaced by the ldap uid
or if not set by the default user name set in option desktop.username
Example
'command': [ 'sh', '-c', 'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
"},{"location":"3.0/config/editconfig/","title":"How to edit pyos
core service configuration file","text":"The pyos
core service configuration file name is od.config
If the od.config
file does not exist, download the default od.config file and save it as od.config
to your abcdesktop local directory.
To make change, edit your own od.config
file
vim od.config \n
"},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"Change the defaultbackgroundcolors
option in the desktop options.
Locate the line desktop.defaultbackgroundcolors
and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'
desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF', '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n
Save your local file od.config
.
To apply changes, you can replace the abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"To check that the new colours are presents in front, open the url http://localhost:30443
, in your web browser, to start a simple abcdesktop.io container.
http://localhost:30443\n
You should see the abcdesktop.io home page.
Press the Sign-in Anonymously, have look
At the right top corner, click on the menu and choose Settings
, then click on Screen Colors
Choose your colour and you should have it as background colour :
Great, you can easily update your configuration file od.config
.
The menu can be changed using the dictionnary object menuconfig
menuconfig : {\n 'settings' : True, \n 'appstore' : True, \n 'screenshot' : True, \n 'download' : True, \n 'logout' : True, \n 'disconnect' : True \n}\n
"},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock
option is a dictionnary read by the front web as a json object.
filemanager
FileManager application terminal
Terminal application webshell
HTML 5, terminal application based on xterm.js webshorcut
Web browser url launch inside the container dock : { \n 'filemanager': { 'args': None,\n 'showinview': u'dock',\n 'name': u'FileManager',\n 'keyword': u'files,file manager',\n 'launch': u'nautilus.Nautilus',\n 'displayname': u'FileManager',\n 'execmode': u'builtin',\n 'cat': u'utilities,office',\n 'id': u'filemanager.d',\n 'icon': u'pantheon-files-icons.svg' },\n 'terminal': { 'args': '',\n 'name': u'TerminalBuiltin',\n 'keyword': u'terminal,shell,bash,builtin,pantheon',\n 'launch': u'qterminal.qterminal',\n 'displayname': u'Terminal Builtin',\n 'execmode': u'builtin',\n 'cat': u'utilities,development',\n 'id': u'terminalbuiltin.d',\n 'hideindock': True,\n 'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n 'webshell': { 'name': u'WebShell',\n 'keyword': u'terminal,shell,webshell,bash',\n 'launch': u'frontendjs.webshell',\n 'displayname': u'Web Shell',\n 'execmode': u'frontendjs',\n 'cat': u'utilities,development',\n 'id': u'webshell.d',\n 'icon': u'webshell.svg' }\n}\n
"},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' }
add
'webshortcut': { 'name': u'xlogo',\n 'showinview': u'dock',\n 'keyword': u'xlogo',\n 'execmode': u'builtin',\n 'launch': u'/usr/bin/xlogo',\n 'displayname': u'xlogo',\n 'execmode': u'builtin',\n 'cat': u'utilities',\n 'id': u'xlogo.d',\n 'icon': u'xlogo.svg',\n 'hideindock': False,\n 'args': '' \n}\n
"},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"host_config
resource description allows to change the running context for docker application. host_config
is a dictionary and uses the same format in applist.json
file and od.config
file.
The same host_config
format is reused in a multiple configuration files. host_config
is present in applist.json
file to build application image, and in od.config
to set default running values in desktop and in application.
For example you can set low cpu and memory values to an application like the great X11 xeyes.
{ \n \"mem_limit\": \"32M\", \n \"shm_size\": \"OM\", \n \"cpu_period\": 50000, \n \"cpu_quota\": 50000, \n \"pid_mode\": false, \n \"network_mode\": \"none\" \n}\n
"},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove
bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period
int The length of a CPU period in microseconds. cpu_quota
int Microseconds of CPU time that the container can get in a CPU period. cpu_shares
int CPU shares relative weight. cpuset_cpus
str CPUs in which to allow execution 0 3 0 1 . cpuset_mems
str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules
list A list of cgroup rules to apply to the container. device_read_bps
bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops
IO per second Limit read rate from a device. device_write_bps
bytes per second Limit write rate from a device. device_write_iops
IO per second Limit write rate from a device. devices
list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests
list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode
str Set the IPC mode for the container. mem_limit
float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation
float or str Memory soft limit mem_swappiness
int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit
str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable
bool Whether to disable OOM killer. oom_score_adj
int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size
str or int Size of /dev/shm e.g. 1G. cap_add
list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}
for example to permit the call ptrace: SYS_PTRACE
, trace arbitrary processes using ptrace, and SYS_ADMIN
, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop
list of str Drop kernel capabilities. dns
list Set custom DNS servers. dns_opt
list Additional options to be added to the container\u2019s resolv.conf file dns_search
list DNS search domains. extra_hosts
dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add
list List of additional group names and/or IDs that the container process will run as. isolation
str Isolation technology to use. Default: None. pid_mode
str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit
int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged
bool Give extended privileges to this container. security_opt
list A list of string values to customize labels for MLS systems such as SELinux. storage_opt
dict Storage driver options per container as a key value mapping. sysctls
dict Kernel parameters to set in the container. ulimits
list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode
str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode
str Sets the UTS namespace mode for the container. Supported values are: host runtime
str Runtime to use with this container. network_mode
str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove
","text":"The auto_remove
is use to remove or not remove an abcdesktop container application or desktop.
For example, when an application container is exited, do we need to remove the container, by running the docker rm
command ?
By default the auto_remove is True
. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False
. Set this value to False
only to troubleshoot an application.
In production this value MUST be set to True
cpu_period
cpu_quota
","text":"cpu_period
Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.
cpu-quota
impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.
privileged
","text":"The privileged
option runs a user container in privileged
mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False
. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.
ipc_mode
","text":"The ipc_mode
value is a string, the default value is 'shareable'
. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.
''
Use daemon default. 'none'
Own private IPC namespace. 'private'
Own private IPC namespace. 'shareable'
Own private IPC namespace, with a possibility to share it with other containers. 'host'
Use the host system IPC namespace. If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt
","text":"
The securityopt
option allow to set the security_opt
default value for a docker application container. security_opt
is the docker parameter.
seccomp=unconfined
no-new-privileges
to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]
Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.
Syscall Descriptionacct
Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT
. add_key
Prevent containers from using the kernel keyring, which is not namespaced. bpf
Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN
. clock_adjtime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clock_settime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. clone
Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN
for CLONE_* flags, except CLONE_USERNS
. create_module
Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE
. delete_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. finit_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. get_kernel_syms
Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. init_module
Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE
. ioperm
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. iopl
Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO
. kcmp
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. kexec_file_load
Sister syscall of kexec_load
that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT
. kexec_load
Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT
. keyctl
Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie
Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN
. mbind
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. mount
Deny mounting, already gated by CAP_SYS_ADMIN
. move_pages
Syscall that modifies kernel memory and NUMA settings. name_to_handle_at
Sister syscall to open_by_handle_at
. Already gated by CAP_DAC_READ_SEARCH
. nfsservctl
Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at
Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH
. perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host. personality
Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root
Deny pivot_root
, should be privileged operation. process_vm_readv
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. process_vm_writev
Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE
. ptrace
Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE
, because it could leak a lot of information on the host. query_module
Deny manipulation and functions on kernel modules. Obsolete. quotactl
Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN
. reboot
Don't let containers reboot the host. Also gated by CAP_SYS_BOOT
. request_key
Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy
Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE
. setns
Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN
. settimeofday
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. stime
Time/date is not namespaced. Also gated by CAP_SYS_TIME
. swapon
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. swapoff
Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN
. sysfs
Obsolete syscall. _sysctl
Obsolete, replaced by /proc/sys. umount
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. umount2
Should be a privileged operation. Also gated by CAP_SYS_ADMIN
. unshare
Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN
, with the exception of unshare --user
. uselib
Older syscall related to shared libraries, unused for a long time. userfaultfd
Userspace page fault handling, largely needed for process migration. ustat
Obsolete syscall. vm86
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. vm86old
In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN
. Read security_opt from the docker website.
"},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilitiescap_add
cap_drop
","text":"This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :
securityContext:\n capabilities:\n desktop.capabilities\n
For example
{ \n 'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n }\n
Permit a container to call ptrace:
Read the docker run command informations Docker run reference
By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.
Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.Further reference information is available on the capabilities(7) - Linux man page
Set this value only to troubleshoot an application.
In production this value MUST be set to an empty dict {}
abcdesktop.io support JIRA
"},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"In od.config
add the jira
option. jira
option is a dictionary with the entries :
And fill the dictionary
jira : { \n 'url': 'https://domainexample.atlassian.net/',\n 'project_id': 'ABCD',\n 'username': 'account@domain.local',\n 'apikey' : 'XXXXXXXXXXXXXXXXXXXX' }\n
Then apply the new configuration file od.config
by retrasting the daemon.
When jira
option is set, a new icon issue
appears at the top.
Click on the issue
icon, a new window is appear.
Fill Summary
and Your Report
values
Then press the Send
button. A notification message appears on the left top corner.
Log into your jira server, and check your backlog
Great you added a new issue tracking.
"},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US
The language list must match with the oc.user local packages all ready installed.
If the language is not found, the default value is set to en_US
The oc.user.18.04 is built-in with the default language package :
language-pack-en
language-pack-fr
apt-get install -y \\\n language-pack-en \\\n language-pack-fr \\\n && locale-gen \\\n && apt-get clean\n
The full supported language list is set by default
language : [ 'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n
This list must match with the Accept-Language
request HTTP header.
abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language
request HTTP header. If the language is not found, the default value is set to en_US
.
Hands-on:
Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.
"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language toen_US
:","text":" The launch LibreOffice Writer. The menu is set to en_US
LibreOffice Writer use English/US en_US
language.
fr_FR
:","text":"You can keep the same abcdesktop.io users session, you do not need to logout.
The launch LibreOffice Writer. The menu is set to fr_FR
LibreOffice Writer use French fr_FR
language.
Great you have change the language settings of applications running inside an abcdesktop docker container
"},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.
Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:
sudo vi /etc/rsyslog.conf\n
Uncomment the following lines and save file :
module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n
"},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"
Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:
sudo systemctl restart rsyslog\n
"},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"
The logging
configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.
logging
dict use the python logging module logging module
The syslog
and graylog
protocol messaging are supported too.
The default features for each handlers are :
handler Featuresconsole
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formated as standard cherrypy_console
log message using a logging.StreamHandler
to the stream: ext://sys.stdout
formatted as access cherrypy_access
log message using a logging.StreamHandler
to the file stream logs/access.log
formatted as access cherrypy_trace
log message using a logging.StreamHandler
to the stream: logs/trace.log
formatted as standard Sub modules used by od.py can log information too.
Sub module Default Valuesdocker.utils.config
{ 'level': 'INFO' },
urllib3.connectionpool
{ 'level': 'ERROR'},
The logging
sample configuration :
# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":"jpxavier-oio has designed the network policy for abcdesktop.io
"},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":"There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights
and the NetworkPolicy permits
.
The NetworkPolicy rights
contains egress
and ingress
for pod selected by tag. rights
means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.
The NetworkPolicy permits
contains egress
to a pod selected by tag. The NetworkPolicy permits
means permit access to this pod.
The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicyrights
and permits
for the memcached
.","text":"The memcached
service is listening on TCP port 11211. The NetworkPolicy for memcached service rights
, named memcached-rights
, allows pods with label run: memcached-od
to expose the TCP port 11211.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: memcached-rights\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n run: memcached-od\n policyTypes:\n - Ingress\n ingress:\n - ports:\n - protocol: TCP\n port: 11211\n from:\n - podSelector:\n matchLabels:\n netpol/memcached: 'true'\n - namespaceSelector:\n matchLabels:\n name: kube-monitor\n podSelector:\n matchLabels:\n netpol/metrics: 'true'\n
The NetworkPolicy for memcached service permits
, named memcached-permits
, allows all pods with label netpol/memcached: 'true'
to reach the TCP port 11211 to pods with label run: memcached-od
.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: memcached-permits\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n netpol/memcached: 'true'\n policyTypes:\n - Egress\n egress:\n - ports:\n - protocol: TCP\n port: 11211\n to:\n - podSelector:\n matchLabels:\n run: memcached-od\n---\n
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights
and permits
for the user's pods.","text":"The ocuser
pod is listening on TCP ports :
The network policy for ocuser's pods rights
is named ocuser-rights
. It allows pods with label type: 'x11server'
to expose the previous TCP ports.
The egress
network policy allows :
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: ocuser-rights\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n type: 'x11server'\n policyTypes:\n - Ingress\n - Egress\n ingress:\n - from:\n - podSelector:\n matchLabels:\n netpol/ocuser: 'true'\n ports:\n - protocol: TCP\n port: 4714\n - protocol: TCP\n port: 6081\n - protocol: TCP\n port: 8000\n - protocol: TCP\n port: 29780\n - protocol: TCP\n port: 29781\n - protocol: TCP\n port: 29782\n - protocol: TCP\n port: 29783\n - protocol: TCP\n port: 29784\n - protocol: TCP\n port: 29785\n # spawner_service_tcp_port\n - protocol: TCP\n port: 29786\n egress:\n # pod user can run dns query to all kube-system\n - ports:\n - protocol: TCP\n port: 53\n - protocol: UDP\n port: 53\n to:\n - namespaceSelector:\n matchLabels:\n name: kube-system\n podSelector:\n matchLabels:\n k8s-app: kube-dns\n# permit www website from pod user \n - ports:\n - protocol: TCP\n port: 443\n - protocol: TCP\n port: 80\n# permit kerberos auth kinit\n - ports:\n - protocol: UDP\n port: 88\n - protocol: TCP\n port: 88\n
The network policy for ocuser's pods permits
is named ocuser-permits
. It allows pods with label netpol/ocuser: 'true'
to reach the user's pods services.
apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: ocuser-permits\n namespace: abcdesktop\nspec:\n podSelector:\n matchLabels:\n netpol/ocuser: 'true'\n policyTypes:\n - Egress\n egress:\n - to:\n - podSelector:\n matchLabels:\n type: 'x11server'\n ports:\n # default pulseaudio websocket audio without webrtc gateway\n - protocol: TCP\n port: 4714\n # vnc websockify\n - protocol: TCP\n port: 6081\n # reserved\n - protocol: TCP\n port: 29780\n # xterm_tcp_port\n - protocol: TCP\n port: 29781\n # printerfile_service_tcp_port\n - protocol: TCP\n port: 29782\n # file_service_tcp_port\n - protocol: TCP\n port: 29783\n # broadcast_tcp_port \n - protocol: TCP\n port: 29784\n # reserved\n - protocol: TCP\n port: 29785\n # spawner_service_tcp_port\n - protocol: TCP\n port: 29786\n
"},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml
file","text":"To apply the network policies run the command :
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
The command returns
networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
"},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n
This http request is denied by the network policy and you should get an error message
You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API
.
To disable the network policies, run the kubectl delete command :
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n
You should get a json document as http response
{}\n
You may need to update the netpol-default.yaml file with your own values.
"},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"stack.mode
describes how abcdesktop.io can manage user's containers and application.
standalone
.kubernetes
.standalone
Use a dockerd only, this is for personal usage kubernetes
Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"stack.kubernetesdefaultdomain
is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes
.
The default value is abcdesktop.svc.cluster.local
If option value mongodb
or memcached
are set, the values are NOT overridden, and keep unchanged.
If option value mongodb
or memcached
are set to None
(by default), then stack.kubernetesdefaultdomain
is used to complete the FQDN of mongodb
and memcached
servers name. This value is concatenated to the server hostname.
mongodb
mongodb.abcdesktop.svc.cluster.local
memcached
memcached.abcdesktop.svc.cluster.local
The dns resolution need a running core-dns
is the namespace kube-system
stack.kubernetesdefaultdomain
is used also if desktop.desktopuseinternalfqdn: True
The pod name FQDN is built using the $podid
.desktop.$stack.kubernetesdefaultdomain
For example, by default :
c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local
run the sudo command inside the user kubernetes pods
balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
"},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"In the securityContext
add the entry 'allowPrivilegeEscalation': True
desktop.pod : {\n 'spec' : {\n 'shareProcessMemorySize': '512Mi',\n 'shareProcessMemory': True,\n 'shareProcessNamespace': True,\n 'securityContext': { \n 'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n 'readOnlyRootFilesystem': False, \n 'allowPrivilegeEscalation': True, \n 'runAsUser': '{{ uidNumber }}',\n 'runAsGroup': '{{ gidNumber }}',\n 'capabilities': { \n 'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n }\n }\n }\n...\n
"},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"Delete the pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
The default balloon password is lmdpocpetit
balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# \n
After the sudo command, you get a root level inside the shell of the users's pod
In production this value should be set to False
"},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":" 'filters': [ 'odcontext' ],\n
syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.
syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.
"},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"Those running linux can simply modify their syslog configuration file following linux syslog config steps
For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :
docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)
"},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"In handlers entry add the following lines:
,\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n
Replace 192.168.0.52 ip address by your local IP Addresse.
You can get your local IP address using the following command:
hostname -I | cut -d ' ' -f1\n
"},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog'
handler in handlers list:
'': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'INFO'\n }\n\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n
"},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"# \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n 'version': 1,\n 'disable_existing_loggers': False,\n 'formatters': {\n 'access': {\n 'format': '%%(message)s - user: %%(userid)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'standard': {\n 'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'syslog': {\n 'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n 'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n },\n 'graylog': {\n 'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s' \n }\n },\n 'filters': {\n 'odcontext': {\n '()': 'oc.logging.OdContextFilter'\n }\n },\n 'handlers': {\n 'console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_console': {\n 'class': 'logging.StreamHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'stream': 'ext://sys.stdout'\n },\n 'cherrypy_access': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'access',\n 'filename': 'logs/access.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8'\n },\n 'cherrypy_trace': {\n 'class': 'logging.handlers.RotatingFileHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'standard',\n 'filename': 'logs/trace.log',\n 'maxBytes': 10485760,\n 'backupCount': 20,\n 'encoding': 'utf8',\n 'mode': 'w'\n },\n 'syslog': {\n 'class': 'logging.handlers.SysLogHandler',\n 'filters': [ 'odcontext' ],\n 'formatter': 'syslog',\n 'socktype': 2,\n 'address' : [ '192.168.0.52', 514 ]\n }\n },\n 'loggers': {\n '': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'DEBUG'\n },\n 'docker.utils.config': {\n 'level': 'INFO'\n },\n 'urllib3.connectionpool': {\n 'level': 'ERROR'\n },\n 'cherrypy.access': {\n 'handlers': [ 'cherrypy_access' ],\n 'level': 'INFO',\n 'propagate': False\n },\n 'cherrypy.error': {\n 'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n 'level': 'ERROR',\n 'propagate': False\n }\n } }\n
"},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"To restart Pods, we will delete and recreate all pods
"},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"To delete pods, execute the following command:
kubectl delete -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"To create pods, execute the following command:
kubectl create -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:
tail /var/log/syslog\n
If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.
"},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"To retain user's home directory files, you can define
hostPath
. The hostPath
can also be a mount point.storageClassName
parameter. Two examples are described one using nfs
, the second one using s3
.hostPath
","text":"In your od.config file, define the new entries desktop.homedirectorytype
desktop.persistentvolumespec
desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim'desktop.persistentvolumespec
: create a new volume for the user's homeDir, for persistentVolume hostPath.desktop.persistentvolumeclaimspec
: create a new volume claim for the user's homeDir# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n 'storageClassName': '',\n 'capacity': { 'storage': '1Gi' },\n 'accessModes': [ 'ReadWriteOnce' ], \n 'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': '',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'
.
{{ provider }}
is the provider's name templated value. {{ userid }}
is the user's id templated value.The list of all template values can be read at the end of this chapter
The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}
. The directory is created automatically by kubernetes.
The /mnt/abcdesktop_volumes/
content lists the provider name.
On the host, the new directory is created, where each home directory is located.
Read the new path for 'hostPath' persistent volumes
ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai 11 11:34 ..\ndrwxr-xr-x 3 root root 4096 mai 12 12:40 anonymous\ndrwxr-xr-x 3 root root 4096 mai 12 12:39 github\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 google\n
For provider google
, all users are listed.
ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 .\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 114102844260599245242\n
For provider google
, list the user home directory for the user 103464335761332102620
ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai 12 12:39 .\ndrwxr-xr-x 5 root root 4096 mai 12 12:40 ..\n-rw------- 1 2048 2048 71 mai 12 12:39 .Xauthority\n-rw-rw-r-- 1 2048 2048 12 janv. 27 18:36 .Xresources\ndrwxr-x--- 3 2048 2048 4096 mai 12 12:39 .cache\ndrwxr-x--- 6 2048 2048 4096 mai 12 12:39 .config\ndrwxrwxr-x 3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r----- 1 2048 2048 0 mai 12 12:39 .gtk-bookmarks\n-rw-rw-r-- 1 2048 2048 564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x--- 3 2048 2048 4096 mai 12 12:39 .local\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 .store\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 .wallpapers\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Desktop\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Documents\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Downloads\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Music\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Pictures\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Public\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Templates\ndrwxr-x--- 2 2048 2048 4096 mai 12 12:39 Videos\n
"},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rulesNote: hostPath
supports file permissions and the pod's init commands chown
or chmod
can be used. The hostPath
can also be a mount point, using nfs.
storageClassName
","text":"To define a persistentVolumeClaim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n
desktop.persistentvolumeclaimspec
is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.
For example
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
Replace mystorageclass
by storageclass of your cloud provider
kubectl get storageclass\n
The example output is as follows on the cloud provider aws.
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
The example output is as follows on the cloud provider digitalocean.
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs
","text":"In this example, we use nfs to share user home directory with each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistentVolumeClaim features.desktop.persistentvolumespec
: None to skip the persistent volume provisioning.desktop.persistentvolumeclaimspec
create a new volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'nfs-csi-sc-ds01',\n 'resources': { \n 'requests': { \n 'storage': '500Mi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
Update the new config file and restart pyos
pod
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32 25Mi RWO Delete Bound abcdesktop/planet-fry-9372f nfs-csi-sc-ds01 3m\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry-9372f Bound pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32 25Mi RWO nfs-csi-sc-ds01 5m7s\n
Get the PersistentVolumeClaim's description
kubectl describe pvc planet-fry-9372f -n abcdesktop \nName: planet-fry-9372f\nNamespace: abcdesktop\nStorageClass: nfs-csi-sc-ds01\nStatus: Bound\nVolume: pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\n pv.kubernetes.io/bound-by-controller: yes\n volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 25Mi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-87066\nEvents:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Normal ExternalProvisioning 7m (x2 over 7m) persistentvolume-controller Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n Normal Provisioning 7m nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3 External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n Normal ProvisioningSucceeded 7m nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3 Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
"},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server
The user fry
has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com
On the nfs server, define a quota for uid fry
. In this case, I use truenas as nfs server.
Create the fry
user with the same attribute and value.
On the Storage |\u00a0Pools |\u00a0User Quotas
, define a quota for the user fry
Set the quota value for fry
Delete previous pvc
and pv
for the fry
user, if need.
Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the dd commands
Run a dd
command to reach the quota value (50 MiB is this case).
dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n
You should get the error Disk quota exceeded
. The size of quota-test-file is over a the quota limit.
50 MB is 52,428,800 Bytes
ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n
The user should not be able to create new file
dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n
The nfs server has returned an error if the user tries to create more than 50 MiB.
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim usingk8s-csi-s3
","text":"In this example, we use s3 to share user home directory with each worker node
Use the https://github.com/yandex-cloud/k8s-csi-s3
as a CSI for S3
with minio as backend.
Follow https://github.com/yandex-cloud/k8s-csi-s3
setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.
---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n mounter: geesefs \n # you can set mount options here, for example limit memory cache size (recommended)\n options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n # to use an existing bucket, specify it here:\n # bucket: abcdesktop\n csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n
Update the csi-s3
storage class to add --setuid 0
as options
kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
"},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config
","text":"In your od.config file, define the entry desktop.persistentvolumeclaimspec
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistentVolumeClaim features.desktop.persistentvolumespec
: None to skip the persistent volume provisioning.desktop.persistentvolumeclaimspec
create a new volume claim for the user's homeDir, the storageClassName csi-s3
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n 'storageClassName': 'csi-s3',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] }\n
"},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"By default the storageclass use mounter: geesefs
. geesefs
does not store file permissions and the init commands chown
or chmod
exit with no zero value, then the pod does not start. All files belongs to root
, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"
.
Update the 'init' in desktop.pod
dict
'init': { \n 'image': 'busybox',\n 'enable': True,\n 'pullpolicy': 'IfNotPresent',\n 'securityContext': {\n 'runAsUser': 0,\n 'runAsGroup': 0 \n },\n 'acl': { 'permit': [ 'all' ] },\n 'command': [ 'sh', '-c', 'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n }\n
Apply the new configuration file and restart pyos pods
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to abcdestkop service using your web browser.
List the persistent volumes
kubectl get pv\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b 1Gi RWO Delete Bound abcdesktop/github-12896316-96cb5 csi-s3 2m46s\n
List the persistent volume claims
# kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\ngithub-12896316-96cb5 Bound pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b 1Gi RWO csi-s3 2m21s\n
"},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"By default abcdesktop use the module-http-protocol-tcp
from pulseaudio sound server to send wav data to the web browser
By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)
In terminal webshell run the command :
pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)
abcdesktop update the pulseaudio configuration, and add module-rtp-send
. The module-rtp-send
pusleaudio send to the destination_ip (in this example 1.2.3.4)
pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n3 module-always-sink\n4 module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n
The sink_name
is rtp, and the source
for the module-rtp-send
is rtp.monitor.
The default source is rtp.monitor
Source #\n State: RUNNING\n Name: rtp.monitor\n Description: Monitor of RTP Multicast Sink\n Driver: module-null-sink.c\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Owner Module: 5\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Base Volume: 65536 / 100% / 0.00 dB\n Monitor of Sink: rtp\n Latency: 0 usec, configured 160000 usec\n Flags: DECIBEL_VOLUME LATENCY \n Properties:\n device.description = \"Monitor of RTP Multicast Sink\"\n device.class = \"monitor\"\n device.icon_name = \"audio-input-microphone\"\n Formats:\n pcm\n
The default output is
\nSource Output #0\n Driver: module-rtp-send.c\n Owner Module: 9\n Client: n/a\n Source: 4\n Sample Specification: aLaw 1ch 8000Hz\n Channel Map: mono\n Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n Corked: no\n Mute: no\n Volume: mono: 65536 / 100% / 0.00 dB\n balance 0.00\n Buffer Latency: 0 usec\n Source Latency: 0 usec\n Resample method: n/a\n Properties:\n media.name = \"RTP Monitor Stream\"\n rtp.source = \"0.0.0.0\"\n rtp.destination = \"1.2.3.4\"\n rtp.mtu = \"1280\"\n rtp.port = \"5119\"\n rtp.ttl = \"1\"\n
By default, the format is pcm
Format: pcm, format.sample_format = \"\\\"aLaw\\\"\" format.rate = \"8000\" format.channels = \"1\" format.channel_map = \"\\\"mono\\\"\"\n
To change the default format update the values in od.config file.
'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n
To get the 'audiopt' and 'audiortpmap' values, read the web pages
Install a janus service from meetecho.com on a server
apt-get install janus\n
"},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.
certificates: {\n cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"Update the od.config file, for example :
# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"webrtc.enable
is a boolean. The default value is False
. Set this value to True
to enable webrtc services for pulseaudio
.
webrtc.server
is a dict. The default value is None
. Set all dictionnary values to enable webrtc access for pulseaudio
and for the web browser client.
The hostip
value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.
'hostip': '1.2.3.4'\n
The host
value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn
. This fqdn
is used by the web browser.
webrtc.server : { 'janus.domain.local' : { 'schema' : 'http',\n 'host': 'janus.domain.local',\n 'hostip': '1.2.3.4',\n 'port': 8088,\n 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n 'apisecret': 'janusrocks',\n 'adminkey': 'supersecret',\n 'startport': 5100 } }\n
"},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"The http request path is /API/manager
/API/manager/buildapplist
None Json object /API/manager/updateactivedirectorysite
None Json object /API/manager/garbagecollector
expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"buildapplist
ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps
. abcdesktop.io
example :
curl http://localhost/API/manager/buildapplist\n
Return the complete array if json images objects ready to run.
\n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None example :
curl http://localhost/API/manager/updateactivedirectorysite
expirein
integer number in seconds since the container create date time force
boolean garbage the container even if a user is connected example :
curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"
To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04
"},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"Execute command swapoff to disable swap.
swapoff -a\n
Load the overlay
and br_netfilter
kernel modules
modprobe overlay\nmodprobe br_netfilter\n
Create the containerd.conf
to load modules
cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io
from docker repository","text":"Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :
Install common packages
apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n
Add source
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n
You will be prompted with a Y/n option in order to proceed with the installation.
apt update\napt install -y containerd.io\n
containerd.io
will then be installed on your system.
containerd.io
","text":"Configure containerd
to use systemd
as cgroup
.
containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n
Enable the containerd utility by running the following command :
systemctl restart containerd\nsystemctl enable containerd\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"Run the following command in order to get the Kubernetes signing key:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"Run the following commands in order to add the Xenial Kubernetes repository:
echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"Create kubernetes.conf
for sysctl.d
cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n
Reload your system sysctl
changes
sysctl --system\n
Install the packages kubelet
kubeadm
kubectl
apt install -y kubelet kubeadm kubectl\n
K8s utilities will then be installed on your system.
You can check the version number of kubeadm
and also verify the installation through the following command:
kubeadm version -o yaml\n
clientVersion:\n buildDate: \"2022-10-12T10:55:36Z\"\n compiler: gc\n gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n gitTreeState: clean\n gitVersion: v1.25.3\n goVersion: go1.19.2\n major: \"1\"\n minor: \"25\"\n platform: linux/amd64\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
"},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
Option : To use the namespace abcdestkop
as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop
All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.
change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop
You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\ndefault-token-5zknd kubernetes.io/service-account-token 3 6m6s\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. This container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n
You should read on the standard output
clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-57c57c4f9d-92fs2 1/1 Running 0 59m\nmongodb-od-f69ff6b5b-v6ztc 1/1 Running 0 59m\nnginx-od-58f86c4dc8-8n9lf 1/1 Running 0 59m\nopenldap-od-d66d66bf4-84lg8 1/1 Running 0 59m\npyos-od-5586b88767-6gdtk 1/1 Running 0 59m\nspeedtest-od-6c59bdff75-n6s66 1/1 Running 0 59m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain
"},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"All kubernetes resources can be inspected to get more informations.
First list elements you want to verify, in the following case, we will inspect pods :
kubectl get pods -n abcdesktop\n
NAME READY STATUS RESTARTS AGE\nnginx-od-db69c45fb-qnd4n 1/1 Running 0 92s\npyos-od-5586b88767-6gdtk 1/1 Running 0 92s\nmemcached-od-db69c45fb-mqt4n 1/1 Running 0 92s\nmongodb-od-ff874fcb5-sm6f7 1/1 Running 0 92s\nspeedtest-od-55c58fdd69-5znpr 0/1 ImagePullBackOff 0 92s\n
As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :
kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop
In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :
Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Warning Failed 7m6s (x4837 over 18h) kubelet, cube05 Error: ImagePullBackOff\n Normal BackOff 2m9s (x4860 over 18h) kubelet, cube05 Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n
As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"kubectl get deployment -n abcdesktop\n
You should read on the standard output
NAME READY UP-TO-DATE AVAILABLE AGE\nmemcached-od 1/1 1 1 10m\nmongodb-od 1/1 1 1 10m\nnginx-od 1/1 1 1 4m26s\nopenldap-od 1/1 1 1 10m\npyos-od 1/1 1 1 3m2s\nspeedtest-od 1/1 1 1 10m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"kubectl get services -n abcdesktop\n
You should read on the standard output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndesktop ClusterIP None <none> <none> 11m\nmemcached ClusterIP 10.107.106.62 <none> 11211/TCP 11m\nmongodb ClusterIP 10.96.113.246 <none> 27017/TCP 11m\nnginx NodePort 10.100.253.228 <none> 80:30443/TCP 11m\nopenldap ClusterIP 10.105.69.239 <none> 389/TCP,636/TCP 11m\npyos ClusterIP 10.98.97.186 <none> 8000/TCP 11m\nspeedtest ClusterIP 10.109.48.166 <none> 80/TCP 11m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"cluster roles are disable by default
kubectl describe ClusterRole pyos-role -n abcdesktop\n
You should read on the standard output
Name: pyos-role\nLabels: <none>\nAnnotations: <none>\nPolicyRule:\n Resources Non-Resource URLs Resource Names Verbs\n --------- ----------------- -------------- -----\n pods/ephemeralcontainers [] [] [create get list watch update patch delete]\n pods/exec [] [] [create get list watch update patch delete]\n persistentvolumes [] [] [get list create delete]\n persistentvolumeclaims [] [] [get list update create delete]\n configmaps [] [] [get list watch create update patch delete]\n pods [] [] [get list watch create update patch delete]\n secrets [] [] [get list watch create update patch delete]\n events [] [] [get list watch]\n pods/log [] [] [get list watch]\n endpoints [] [] [get list]\n nodes [] [] [get watch list]\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"cluster roles Bindind are disable by default
kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n
You should read on the standard output
Name: pyos-rbac\nLabels: <none>\nAnnotations: <none>\nRole:\n Kind: ClusterRole\n Name: pyos-role\nSubjects:\n Kind Name Namespace\n ---- ---- ---------\n ServiceAccount pyos-serviceaccount abcdesktop\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n
You should read on the standard output
2023-05-17 13:29:08 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO ] __main__.trace_request:anonymous /healthz\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"To rollout restart the abcdesktop deployment
kubectl rollout restart deployment -n abcdesktop\n
You should read on the standard output
deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n
Check the pods status
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-64c56f9458-jcf9x 1/1 Running 0 32s\nmongodb-od-5b5cc9946d-q7fph 1/1 Running 0 32s\nnginx-od-58bdf79df4-skjsn 1/1 Running 0 32s\nopenldap-od-6dcc5d7f8b-g8gvj 1/1 Running 0 32s\npyos-od-784bd7b5c5-tdzxx 1/1 Running 0 32s\nspeedtest-od-5ff99b6579-st9jx 1/1 Running 0 32s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.0.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json file to the images REST API
curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"This section apply only to configure kubernetes for GNU/Linux.
abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.
"},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"Linux Requierements
"},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.
"},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.
swapoff -a\n
If you have some swaps in /etc/fstab, just comment them out. swapoff -a
will disable all swaps temporarily.
systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
"},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"Run the following command as sudo on the master node:
kubeadm init --pod-network-cidr=10.244.0.0/16\n
The process might take a minute or more depending on your internet connection.
To be able to manage your kubernetes server, you need to run the following commands as a regular user:
mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
"},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.
kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n
It should return the following string.
node/<your-hostname> untainted\n
Taints are Kubernetes flags to prevent Pod Scheduling.
Confirm that you now have a node in your cluster with the following command.
kubectl get nodes -o wide\n
It should return something like the following.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nhostname NotReady control-plane 3m17s v1.25.3 192.168.7.187 <none> Ubuntu 22.04.1 LTS 5.15.0-52-generic containerd://1.6.9\n
"},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n
It should return the following strings.
namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
"},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"Now when you see the status of the nodes, you will see that the master-node is ready :
kubectl get nodes -o wide\n
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nHostname Ready control-plane 4m12s v1.25.3 192.168.7.187 <none> Ubuntu 22.04.1 LTS 5.15.0-52-generic containerd://1.6.9\n
At this step, there is no more Taints
and your node is Ready
.
Next step, continue with the setup abcdesktop for kubernetes.
"},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":"x86-64
(arm-64
is not yet available)gimp
, libreoffice writer
, libreoffice calc
, libreoffice math
, libreoffice impress
, firefox
) and core image services.$ kubectl version --output=yaml\n
serverVersion:\n buildDate: \"2022-05-24T12:18:48Z\"\n compiler: gc\n gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n gitTreeState: clean\n gitVersion: v1.24.1\n goVersion: go1.18.2\n major: \"1\"\n minor: \"24\"\n platform: linux/amd64\n
kubernetes pod
ephemeral container
. Read more informations about on ephermeral container
microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.
"},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"$ microk8s kubectl version --output=yaml\nclientVersion:\n buildDate: \"2022-09-28T14:42:45Z\"\n compiler: gc\n gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n gitTreeState: clean\n gitVersion: v1.24.6-2+949b88ddc8b8cc\n goVersion: go1.18.5\n major: \"1\"\n minor: 24+\n platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n buildDate: \"2022-09-28T14:40:13Z\"\n compiler: gc\n gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n gitTreeState: clean\n gitVersion: v1.24.6-2+949b88ddc8b8cc\n goVersion: go1.18.5\n major: \"1\"\n minor: 24+\n platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns
add one to microk8s
","text":"$ microk8s enable dns\n
You should ready on stdout
$ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n
Check microk8s status
$ microk8s status\nmicrok8s is running\nhigh-availability: no\n datastore master nodes: 127.0.0.1:19001\n datastore standby nodes: none\naddons:\n enabled:\n dns # (core) CoreDNS\n ha-cluster # (core) Configure high availability on the current node\n
"},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"images support only architectures x86-64
. The architectures supported by this image is:
The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)
"},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshootingnginx
errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-78578c879-bb8qq 1/1 Running 0 164m\nmongodb-od-5b4dd4765f-ptw2j 1/1 Running 0 164m\nnginx-od-788c97cdc9-b4gbq 0/1 CrashLoopBackOff 36 (57s ago) 164m\nopenldap-od-65759b74dc-tbvfg 1/1 Running 0 164m\npyos-od-7d5d9457cf-jw6nk 1/1 Running 0 164m\nspeedtest-od-c94b56c88-48cvq 1/1 Running 0 164m\n
The pod nginx-od-788c97cdc9-b4gbq
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n
Nginx has failed to start. There is an error in the configuration file.
We need to fix the nginx-config
ConfigMap in the yaml file.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.0\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n
Check that nginx pod has been updated and that the status is Running
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-666df64f4-whtng 1/1 Running 0 2m30s\n
Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.
Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log
kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n
Nginx returns an explicit error, the /etc/nginx/sites-enabled/default
file is wrong.
nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n
It's time to fix the nginx-config
ConfigMap in the yaml file.
pyos
errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-sw9n5 1/1 Running 0 90m\nmongodb-od-77c945467d-c47nl 1/1 Running 0 90m\nnginx-od-666df64f4-wf99b 1/1 Running 0 22m\nopenldap-od-5bbdd75864-m6qmh 1/1 Running 0 90m\npyos-od-57946b67c4-m5zc9 0/1 CrashLoopBackOff 5 (17s ago) 3m18s\nspeedtest-od-7f5484966f-kxkw4 1/1 Running 0 90m\n
The pod pyos-od-57946b67c4-m5zc9
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
It's time to fix the abcdesktop-config
ConfigMap.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name : pyos\n imagePullPolicy: Always\n image: abcdesktopio/oc.pyos:3.0\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n
Check that pyos pod is Running
kubectl get pods -l run=pyos-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npyos-od-6cd679d6b8-css9q 1/1 Running 0 5s\n
Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.
Run the command cd /var/pyos && ./od.py
kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n
od.py
command returns the same explicit error, the od.config
file is wrong.
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
We need to fix the abcdesktop-config
ConfigMap in the yaml file.
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"To uninstall abcdesktop. Choose run run the uninstall-3.0.sh
bash script using a curl or run step by step uninstall commands manually.
Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n
You should read on stdout
starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
"},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"Run the bash commands from the uninstall-3.0.sh
main content :
echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n
The last command kubectl delete namespace
can take few minutes.
Please wait for the output message:
abcdesktop is uninstalled\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"To retain user's home directory files, you can define
In most cases with managed providers, you do not need to create a Persistent Volume
, just a Persistent Volume Claim
. Even in a non-managed set up, the Persistent Volume
is generally created by the cluster administrator while Persistent Volume Claim
is used by the end-user. The Persistent Volume Claim
is namespaced ressource.
Persistent Volume Claim
support.Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume
and Persistent Volume Claim
.
ClusterRole
only if you need to create Persistent Volume
","text":"Persistent Volume
is a non-namespaced resource, so you need to update the pyos-role
to ClusterRole
to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]
- apiGroups: [\"\"]\n resources: [\"persistentvolumes\"]\n verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n
Update the default pyos role to ClusterRole
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume
and persistent volume claim
","text":"To define Persistent Volume
or Persistent Volume Claim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"To use desktop.persistentvolume
and desktop.persistentvolumeclaim
values, the desktop.homedirectorytype
must be set to persistentVolumeClaim
desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume
is optional","text":"desktop.persistentvolume
is optional and can be set to None
, else the type of desktop.persistentvolume
parameter must be a dict (dictionary).
If desktop.persistentvolume is None
then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.
If desktop.persistentvolume is a dict
then abcdesktop creates the persistent volume.
If you set desktop.persistentvolume
to None
, or if you create the persistent volume manualy, then you don't need to update the pyos role.
desktop.persistentvolumeclaim
","text":"The type of desktop.persistentvolumeclaim
is dictionary or a string.
If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim
must be defined as a dict
or a str
.
Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role
for pyos-role
.
if desktop.persistentvolume
option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName
value to the created persistent volume.
Get more information about PersistentVolume and PersistentVolumeClaim.
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Definedesktop.persistentvolumeclaim
as a string","text":"All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany
, else only one pod (the first one) will bound the pvc.
Create a persistent volume
kubectl get pv -n abcdesktop\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npv-nfs 10Gi RWX Retain Bound abcdesktop/homedir nfs-csi 3d22h\n
kubectl describe pv pv-nfs \nName: pv-nfs\nLabels: <none>\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/homedir\nReclaim Policy: Retain\nAccess Modes: RWX\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: nfs-server.default.svc.cluster.local/share##\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir\nEvents: <none>\n
Create a persistent volume claim
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nhomedir Bound pv-nfs 10Gi RWX nfs-csi 3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName: homedir\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: pv-nfs\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWX\nVolumeMode: Filesystem\nUsed By: fry-88a6e\n hermes-7d84b\nEvents: <none>\n
In the od.config file, set the values
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n
If you need to use subPath
desktop.persistentvolumeclaimforcesubpath: True\n
'subPath' is not supported for ephemeral container.
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Definedesktop.persistentvolumeclaim
as a dictionary","text":"in od.config file
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Replace mystorageclass
by storageclass of your cloud provider.
To list the storage classes
kubectl get storageclass\n
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec
and desktop.persistentvolumeclaim
","text":"Value defines inside {{ VALUE }}
is replaced by the templated value keys:
The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rulesThe uuid
have the same value for the persistent volume and for the persistent volume claim. uuid
can be use for naming the PVC or the PV, or on all string values.
desktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n },\n 'spec': {\n 'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n 'storageClassName': 'nfs-csi',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
The variables persistentvolumeclaim and persistentvolume become
desktop.persistentvolumeclaim: {\n 'metadata': {'name': 'planet-fry-1841f'}, \n 'spec': {\n 'volumeName': 'planet-fry-1841f', \n 'storageClassName': 'nfs-csi', \n 'resources': {\n 'requests': {'storage': '1Gi'}\n }, \n 'accessModes': ['ReadWriteOnce']\n }\n}\ndesktop.persistentvolume: {\n 'metadata': { 'name': 'planet-fry-1841f'}, \n 'spec': {\n 'storageClassName': 'nfs-csi', \n 'mountOptions': ['nfsvers=3'], \n 'capacity': {'storage': '10Gi'}, \n 'accessModes': ['ReadWriteOnce'], \n 'csi': {\n 'driver': 'nfs.csi.k8s.io', \n 'readOnly': False, \n 'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n 'volumeAttributes': {\n 'server': '192.168.7.101', \n 'share': '/volume1/homedir/fry'\n }\n }\n }\n}\n
"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim
is True.
The default value for desktop.removepersistentvolume
is False
.
During the remove desktop process, delete or not the persistent volume claim.
The default value for desktop.removepersistentvolumeclaim
is False
.
csi-driver-nfs
","text":"In this example, we use nfs protocol to share user home directory on each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaim
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistent volume claim features.desktop.persistentvolume
: create a new persistent volume.desktop.persistentvolumeclaim
create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'volumeName': '{{ provider }}-{{ userid }}',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Update the new config file and restart pyos
pods. Update the pyos role to allow
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
abcdesktop creates PV and PVC for you.
"},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Bound abcdesktop/planet-fry nfs-csi 2m58s\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound planet-fry 10Gi RWO nfs-csi 107s\n
Get the persistent volume claim's description
kubectl describe pvc planet-fry -n abcdesktop\nName: planet-fry\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-055f6\nEvents: <none>\n
Get the persistent volume description
kubectl describe pv planet-fry\nName: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/planet-fry\nReclaim Policy: Retain\nAccess Modes: RWO\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: 192.168.7.101#volume1#homedir#fry\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir/fry\nEvents: <none>\n
"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage
on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"Update od.config file with the options
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'do-block-storage',\n 'resources': {\n 'requests': {\n 'storage': '1Gi'\n }\n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n
Update the configmap
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to your abcdesktop service, you should read on the html page, the status
b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n
Read the new pod for fry the user fry
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nfry-0d805 4/4 Running 0 17m\nmemcached-od-5ff8844d56-lcn7p 1/1 Running 0 106m\nmongodb-od-77c945467d-97g8w 1/1 Running 0 106m\nnginx-od-7445969696-lpfhh 1/1 Running 0 106m\nopenldap-od-5bbdd75864-dprvl 1/1 Running 0 106m\npyos-od-7584db6787-chtdc 1/1 Running 0 19m\nspeedtest-od-7f5484966f-5pl6k 1/1 Running 0 106m\n
Read the pvc for fry
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound pvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO do-block-storage 17m\n
Read the pv for fry
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO Delete Bound abcdesktop/planet-fry do-block-storage 17m\n
"},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim
is False
","text":"When desktop.deletepersistentvolumeclaim
is True
and desktop.deletepersistentvolume
is False
, if you create manually the persistent volumes, you may have to patch the claimRef
of the persistent volumes to make it Available
again.
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Released abcdesktop/planet-fry nfs-csi 4m1 \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Available nfs-csi 8m\n
"},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04. km
is a command tools from https://github.com/jfv-opensource/kube-tools repository.
Clone kube-tools and run km --apply
as root.
git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n
kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.
Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309: retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
"},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n
You can read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-6dt28 1/1 Running 0 40s\nmongodb-od-77c945467d-r82kv 1/1 Running 0 40s\nnginx-od-7445969696-6z88w 1/1 Running 0 40s\nopenldap-od-5bbdd75864-d5bpq 1/1 Running 0 38s\npyos-od-7584db6787-vnp64 1/1 Running 0 39s\nspeedtest-od-7f5484966f-jsb2m 1/1 Running 0 39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
You may need to replace the default namespace abcdesktop
by your own. The install-3.1.sh
bash script allow you to set the new namespace as an option.
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n
Run install-3.1.sh
./install-3.1.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-b75fb 1/1 Running 0 20s\nmongodb-od-77c945467d-t8cv7 1/1 Running 0 20s\nnginx-od-b8c8c7b95-lkjl6 1/1 Running 0 20s\nopenldap-od-56b6564c85-2npln 1/1 Running 0 18s\npyos-od-67dfc48d84-kww9n 1/1 Running 0 20s\nspeedtest-od-894b7c886-69vc4 1/1 Running 0 20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. The container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main configuration file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n
You should read on the standard output
role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 18s\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 18s\nnginx-od-7445969696-mwlc9 1/1 Running 0 18s\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 18s\npyos-od-7584db6787-tjlvk 1/1 Running 0 18s\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 18s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Also, you can run again the command
kubectl get pods -n abcdesktop\n
You should see that the anonymous-XXXXX
pod have been created and is Running
NAME READY STATUS RESTARTS AGE\nanonymous-50b0f 4/4 Running 0 5m22s\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 77m\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 77m\nnginx-od-7445969696-mwlc9 1/1 Running 0 77m\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 77m\npyos-od-7584db6787-tjlvk 1/1 Running 0 77m\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 77m\n
Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.1.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1
curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n
To inspect image json you can also run crictl inspecti
or docker inspect
command.
crictl inspecti abcdesktopio/2048.d:3.1 > 2048.json
docker inspect abcdesktopio/2048.d:3.1 > 2048.json
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json
file to the images REST endpoint
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshootingnginx
errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-78578c879-bb8qq 1/1 Running 0 164m\nmongodb-od-5b4dd4765f-ptw2j 1/1 Running 0 164m\nnginx-od-788c97cdc9-b4gbq 0/1 CrashLoopBackOff 36 (57s ago) 164m\nopenldap-od-65759b74dc-tbvfg 1/1 Running 0 164m\npyos-od-7d5d9457cf-jw6nk 1/1 Running 0 164m\nspeedtest-od-c94b56c88-48cvq 1/1 Running 0 164m\n
The pod nginx-od-788c97cdc9-b4gbq
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n
Nginx has failed to start. There is an error in the configuration file.
We need to fix the nginx-config
ConfigMap in the yaml file.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.1\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n
Check that nginx pod is Running
kubectl get pods -l run=nginx-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nnginx-od-666df64f4-whtng 1/1 Running 0 2m30s\n
Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.
Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log
kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n
Nginx returns an explicit error, the /etc/nginx/sites-enabled/default
file is wrong.
nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n
It's time to fix the nginx-config
ConfigMap in the yaml file.
pyos
errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-sw9n5 1/1 Running 0 90m\nmongodb-od-77c945467d-c47nl 1/1 Running 0 90m\nnginx-od-666df64f4-wf99b 1/1 Running 0 22m\nopenldap-od-5bbdd75864-m6qmh 1/1 Running 0 90m\npyos-od-57946b67c4-m5zc9 0/1 CrashLoopBackOff 5 (17s ago) 3m18s\nspeedtest-od-7f5484966f-kxkw4 1/1 Running 0 90m\n
The pod pyos-od-57946b67c4-m5zc9
has CrashLoopBackOff
status. This is wrong.
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
It's time to fix the abcdesktop-config
ConfigMap.
If the kubectl logs
command doesn't return usable information. You can update the pod default command and then start the service by hands.
Update the container description to replace the default command by a sleep command
- name : pyos\n imagePullPolicy: Always\n image: abcdesktopio/oc.pyos:3.1\n command: [ \"/usr/bin/sleep\" ]\n args: [\"1d\"]\n
The container will start the command /usr/bin/sleep
for 1d
(one day).
A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug
kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n
Check that pyos pod is Running
kubectl get pods -l run=pyos-od -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npyos-od-6cd679d6b8-css9q 1/1 Running 0 5s\n
Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.
Run the command cd /var/pyos && ./od.py
kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n
od.py
command returns the same explicit error, the od.config
file is wrong.
2023-10-15 14:53:00,136 [INFO ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n value = unrepr(value)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n obj = b.astnode(s)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n p = ast.parse('__tempvalue__ = ' + s)\n File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n return compile(source, filename, mode, flags,\n File \"<unknown>\", line 1\n __tempvalue__ = 'abcdesktop\n ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/var/pyos/oc/logging.py\", line 89, in configure\n init_logging(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n File \"/var/pyos/oc/logging.py\", line 66, in load_config\n cfg = Config(path)['global']['logging']\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n self.update(file)\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n self._apply(Parser.load(config))\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n return Parser().dict_from_file(input) if is_file else input.copy()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n return self.as_dict()\n File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n
We need to fix the abcdesktop-config
ConfigMap in the yaml file.
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"To uninstall abcdesktop. Choose run run the uninstall-3.A.sh
bash script using a curl.
Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n
You should read on stdout
abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n
Please wait for the output message:
[OK] namespace \"abcdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n
Run the uninstall-3.1.sh command line with your own namespace
./uninstall-3.1.sh --namespace superdesktop\n
You should read on stdout
abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.
"},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"To retain user's home directory files, you can define
In most cases with managed providers, you do not need to create a Persistent Volume
, just a Persistent Volume Claim
. Even in a non-managed set up, the Persistent Volume
is generally created by the cluster administrator while Persistent Volume Claim
is used by the end-user. The Persistent Volume Claim
is namespaced ressource.
Persistent Volume Claim
support.Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume
and Persistent Volume Claim
.
ClusterRole
only if you need to create Persistent Volume
","text":"Persistent Volume
is a non-namespaced resource, so you need to update the pyos-role
to ClusterRole
to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]
- apiGroups: [\"\"]\n resources: [\"persistentvolumes\"]\n verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n
Update the default pyos role to ClusterRole
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume
and persistent volume claim
","text":"To define Persistent Volume
or Persistent Volume Claim
, update the od.config file and set
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"To use desktop.persistentvolume
and desktop.persistentvolumeclaim
values, the desktop.homedirectorytype
must be set to persistentVolumeClaim
desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume
is optional","text":"desktop.persistentvolume
is optional, the default value is None
. desktop.persistentvolume
can be None
, or a string
or a dict
.
If desktop.persistentvolume is None
then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.
If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.
If desktop.persistentvolume is a dict
then abcdesktop creates the persistent volume. The dict
values of persistent volume support template values.
For example :
desktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
If you set desktop.persistentvolume
to None
, or if you create the persistent volume manualy, then you don't need to update the pyos role.
desktop.persistentvolumeclaim
","text":"desktop.persistentvolumeclaim
is optional, the default value is None
. The type of desktop.persistentvolumeclaim
can be None
, or a string
or a dict
.
If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim
must be defined as a dict
or a string
.
Kubernetes persistent volume is a namespaced resource
, so you can keep the default rbac-role
for pyos-role
.
if desktop.persistentvolume
option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName
value to the created persistent volume.
Get more information about PersistentVolume and PersistentVolumeClaim.
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Definedesktop.persistentvolumeclaim
as a string","text":"All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany
, else only one pod (the first one) will bound the pvc.
Create a persistent volume
kubectl get pv -n abcdesktop\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npv-nfs 10Gi RWX Retain Bound abcdesktop/homedir nfs-csi 3d22h\n
kubectl describe pv pv-nfs \nName: pv-nfs\nLabels: <none>\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/homedir\nReclaim Policy: Retain\nAccess Modes: RWX\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: nfs-server.default.svc.cluster.local/share##\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir\nEvents: <none>\n
Create a persistent volume claim
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nhomedir Bound pv-nfs 10Gi RWX nfs-csi 3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName: homedir\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: pv-nfs\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWX\nVolumeMode: Filesystem\nUsed By: fry-88a6e\n hermes-7d84b\nEvents: <none>\n
In the od.config file, set the values
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n
If you need to use subPath
desktop.persistentvolumeclaimforcesubpath: True\n
'subPath' is not supported for ephemeral container.
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Definedesktop.persistentvolumeclaim
as a dictionary","text":"in od.config file
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'mystorageclass',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Replace mystorageclass
by storageclass of your cloud provider.
To list the storage classes
kubectl get storageclass\n
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\ngp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false \n
NAME PROVISIONER RECLAIMPOLICY Immediate false 3h22m\ndo-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\ndo-block-storage-xfs dobs.csi.digitalocean.com Delete Immediate true 2d7h\ndo-block-storage-xfs-retain dobs.csi.digitalocean.com Retain Immediate true 2d7h\n
"},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec
and desktop.persistentvolumeclaim
","text":"Value defines inside {{ VALUE }}
is replaced by the templated value keys:
The template values can be one of them :
var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rulesThe uuid
have the same value for the persistent volume and for the persistent volume claim. uuid
can be use for naming the PVC or the PV, or on all string values.
desktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n },\n 'spec': {\n 'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n 'storageClassName': 'nfs-csi',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n
The variables persistentvolumeclaim and persistentvolume become
desktop.persistentvolumeclaim: {\n 'metadata': {'name': 'planet-fry-1841f'}, \n 'spec': {\n 'volumeName': 'planet-fry-1841f', \n 'storageClassName': 'nfs-csi', \n 'resources': {\n 'requests': {'storage': '1Gi'}\n }, \n 'accessModes': ['ReadWriteOnce']\n }\n}\ndesktop.persistentvolume: {\n 'metadata': { 'name': 'planet-fry-1841f'}, \n 'spec': {\n 'storageClassName': 'nfs-csi', \n 'mountOptions': ['nfsvers=3'], \n 'capacity': {'storage': '10Gi'}, \n 'accessModes': ['ReadWriteOnce'], \n 'csi': {\n 'driver': 'nfs.csi.k8s.io', \n 'readOnly': False, \n 'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n 'volumeAttributes': {\n 'server': '192.168.7.101', \n 'share': '/volume1/homedir/fry'\n }\n }\n }\n}\n
"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim
is True.
The default value for desktop.removepersistentvolume
is False
.
During the remove desktop process, delete or not the persistent volume claim.
The default value for desktop.removepersistentvolumeclaim
is False
.
csi-driver-nfs
","text":"In this example, we use nfs protocol to share user home directory on each worker node
Use the https://github.com/kubernetes-csi/csi-driver-nfs
as a csi-driver-nfs
with a nfs server as backend.
On the nfs server, create an export with the no_root_squash
option
For example export /volume1/pods
/volume1/pods 192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs
","text":"Run the install install-driver.sh
command from kubernetes-csi/csi-driver-nfs GitHub repository.
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n
Create a storage class file nfs-csi-sc-ds01.yaml,
192.168.7.101
by your own nfs server ip address/volume1/pods
by your own shareContent of the default nfs-csi-sc-ds01.yaml
apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n server: 192.168.7.101\n share: /volume1/pods\n mountPermissions: \"0755\"\n # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n
You read the response on stdout
storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n
Check the storage class nfs-csi-sc-ds01
kubectl get sc\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\nnfs-csi-sc-ds01 nfs.csi.k8s.io Delete Immediate false 18m\n
"},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config
file","text":"In your od.config file, define the entry desktop.persistentvolumeclaim
desktop.homedirectorytype
: 'persistentVolumeClaim' to use the persistent volume claim features.desktop.persistentvolume
: create a new persistent volume.desktop.persistentvolumeclaim
create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01
The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC
# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n 'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'mountOptions': [\n 'nfsvers=3'\n ],\n 'capacity': {\n 'storage': '10Gi'\n },\n 'accessModes': [ 'ReadWriteOnce' ],\n 'csi': {\n 'driver': 'nfs.csi.k8s.io',\n 'readOnly': False,\n 'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n 'volumeAttributes': {\n 'server': '192.168.7.101',\n 'share': '/volume1/homedir/{{ userid }}'\n } } } }\n\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'nfs-csi',\n 'volumeName': '{{ provider }}-{{ userid }}',\n 'resources': { \n 'requests': { \n 'storage': '1Gi'\n } \n },\n 'accessModes': [ 'ReadWriteMany' ] } }\n
Update the new config file and restart pyos
pods. Update the pyos role to allow
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
abcdesktop creates PV and PVC for you.
"},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Login as user (Philip J. Fry
, fry
)
The new desktop for Philip J. Fry
is created.
Start the web shell command using the search bar
Using the web shell application start the df command
The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32
List the new PersistentVolume
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Bound abcdesktop/planet-fry nfs-csi 2m58s\n
List the new PersistentVolumeClaim
kubectl get pvc -n abcdesktop \nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound planet-fry 10Gi RWO nfs-csi 107s\n
Get the persistent volume claim's description
kubectl describe pvc planet-fry -n abcdesktop\nName: planet-fry\nNamespace: abcdesktop\nStorageClass: nfs-csi\nStatus: Bound\nVolume: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bind-completed: yes\nFinalizers: [kubernetes.io/pvc-protection]\nCapacity: 10Gi\nAccess Modes: RWO\nVolumeMode: Filesystem\nUsed By: fry-055f6\nEvents: <none>\n
Get the persistent volume description
kubectl describe pv planet-fry\nName: planet-fry\nLabels: access_provider=planet\n access_providertype=ldap\n access_userid=fry\nAnnotations: pv.kubernetes.io/bound-by-controller: yes\nFinalizers: [kubernetes.io/pv-protection]\nStorageClass: nfs-csi\nStatus: Bound\nClaim: abcdesktop/planet-fry\nReclaim Policy: Retain\nAccess Modes: RWO\nVolumeMode: Filesystem\nCapacity: 10Gi\nNode Affinity: <none>\nMessage: \nSource:\n Type: CSI (a Container Storage Interface (CSI) volume source)\n Driver: nfs.csi.k8s.io\n FSType: \n VolumeHandle: 192.168.7.101#volume1#homedir#fry\n ReadOnly: false\n VolumeAttributes: server=192.168.7.101\n share=/volume1/homedir/fry\nEvents: <none>\n
"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage
on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"Update od.config file with the options
desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n 'metadata': {\n 'name': '{{ provider }}-{{ userid }}',\n },\n 'spec': {\n 'storageClassName': 'do-block-storage',\n 'resources': {\n 'requests': {\n 'storage': '1Gi'\n }\n },\n 'accessModes': [ 'ReadWriteOnce' ] } }\n
Update the configmap
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
Restart pyos pod
kubectl delete pods -l run=pyos-od -n abcdesktop\n
Login to your abcdesktop service, you should read on the html page, the status
b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n
Read the new pod for fry the user fry
kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\nfry-0d805 4/4 Running 0 17m\nmemcached-od-5ff8844d56-lcn7p 1/1 Running 0 106m\nmongodb-od-77c945467d-97g8w 1/1 Running 0 106m\nnginx-od-7445969696-lpfhh 1/1 Running 0 106m\nopenldap-od-5bbdd75864-dprvl 1/1 Running 0 106m\npyos-od-7584db6787-chtdc 1/1 Running 0 19m\nspeedtest-od-7f5484966f-5pl6k 1/1 Running 0 106m\n
Read the pvc for fry
kubectl get pvc -n abcdesktop\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\nplanet-fry Bound pvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO do-block-storage 17m\n
Read the pv for fry
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1 1Gi RWO Delete Bound abcdesktop/planet-fry do-block-storage 17m\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath
","text":"desktop.persistentvolumeclaimforcesubpath
is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath
is False
If desktop.persistentvolumeclaimforcesubpath
is set to True
then persistentvolumeclaim
is mounted with the subPath
option.
Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath
to True
.
If you try to start an ephemeral container application, you get an error code 422
and the message
{ \n \"reason\":\"FieldValueForbidden\",\n \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
"},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath
option","text":"In this case :
192.168.7.101
) exports /volume1/home
We create the unique PersistentVolume
named pv-nfs
.
---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n annotations:\n pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n name: pv-nfs\nspec:\n capacity:\n storage: 10Gi\n accessModes:\n - ReadWriteMany\n persistentVolumeReclaimPolicy: Retain\n storageClassName: nfs-csi\n mountOptions:\n - nfsvers=3\n csi:\n driver: nfs.csi.k8s.io\n readOnly: false\n # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n # make sure this value is unique for every share in the cluster\n volumeHandle: nfs-server.default.svc.cluster.local/share##\n volumeAttributes:\n server: 192.168.7.101\n share: /volume1/home\n---\n
accessModes is ReadWriteMany
for the PersistentVolume
We create the unique PersistentVolumeClaim
named pvc-nfs-homedir
---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n name: pvc-nfs-homedir\n namespace: abcdesktop\nspec:\n accessModes:\n - ReadWriteMany\n resources:\n requests:\n storage: 10Gi\n volumeName: pv-nfs\n storageClassName: nfs-csi\n---\n
accessModes is ReadWriteMany
for the PersistentVolumeClaim
We define in od.config file
desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n
All pods share the same PersistentVolumeClaim
named pvc-nfs-homedir
, the desktop.persistentvolumeclaimforcesubpath
is set to True
, the subPath value is set with the default of the current LDAP userid
. So the user's home directory is /volume1/home/{{ userid }}
. The nfs server allows user to access subfolders, the mount operation is permitted.
desktop.deletepersistentvolumeclaim
is False
","text":"When desktop.deletepersistentvolumeclaim
is True
and desktop.deletepersistentvolume
is False
, if you create manually the persistent volumes, you may have to patch the claimRef
of the persistent volumes to make it Available
again.
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Released abcdesktop/planet-fry nfs-csi 4m1 \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\nplanet-fry 10Gi RWO Retain Available nfs-csi 8m\n
"},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"Play sound from a container to web browser using WebRTC
"},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":"Read the introduction to WebRTC protocols
You need a STUN server. You can use any STUN server like stun.l.google.com:19302. Session Traversal Utilities for NAT (STUN) is a protocol to discover your public address and determine any restrictions in your router that would prevent a direct connection with a peer.
You need your own TURN server. We use COTURN server as describe in this chapter. Traversal Using Relays around NAT (TURN) is meant to bypass the Symmetric NAT restriction by opening a connection with a TURN server and relaying all information through that server.
abcdesktop/pulseaudio:3.2
container executes the following services
STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.
The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good
{ 'urls': 'stun:stun.l.google.com:19302' }\n
"},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.
You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.
"},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.
apt-get install coturn \n
You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.
Default minimal configuration file /etc/turnserver.conf
for abcdesktop.
listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n
Update the following configuration file with you own values
static-auth-secret
server-name
realm
cert
pkey
Then start your turn service.
"},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmapod.config
file","text":"Add new webrtc's entries
webrtc.enable
to True
webrtc.rtc_configuration
dictionary for the web browser webrtc stackwebrtc.coturn
dictionnay entries for the web browser webrtc stackcoturn_static_auth_secret
is the static-auth-secret
value define in turnserver.conf
filettl
define the time to live for the auth value protocol
define the Traversal Using Relays around NAT protocol, value can be turn
or turns
url
url for the coturn servicewebrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n 'coturn_static_auth_secret': 'CHANGEME', \n 'ttl':3600,\n 'protocol': 'turns',\n 'url': 'turn.domain.local:3478' }\n
pyos merges a new rtc_configuration
json document from the webrtc.coturn
and from webrtc.coturn
values.
pyos adds username
and credential
entries. For example, a new rtc_configuration
json document is send to the web browser
{\n \"iceServers\": [\n { \"urls\": \"stun:stun.l.google.com:19302\" },\n { \"urls\": \"turns:nturns.domain.local:3478\",\n \"username\": \"1703086872\",\n \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n ]\n}\n
desktop.envlocal
to add STUN_SERVER
STUN_SERVER value is used by the gstreamer webrtcbin
desktop.envlocal : { \n 'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n
sound
entry in desktop.pod
to enable pulseaudio
service Update the value 'enable': False
to 'enable': True
desktop.pod : \n\n ...[CUT HERE ]...\n\n'sound': { \n 'image': 'abcdesktopio/oc.pulseaudio:3.2',\n 'pullpolicy': 'IfNotPresent',\n 'enable': True,\n 'tcpport': 4714,\n 'acl': { 'permit': [ 'all' ] },\n 'resources': { \n 'requests': { 'memory': \"8Mi\", 'cpu': \"50m\" }, \n 'limits' : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n } },\n\n ...[CUT HERE ]...\n\n
abcdesktop-config
for the od.config
filekubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
kubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"Open your web browser, and go to your abcdesktop web site.
Make sure to use secured https protocol, else WebRTC is disabled.
"},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"Login using credentials, for example
The sound is not yet available
"},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"Few seconds later, sound becomes available.
The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.
"},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"Open a Terminal Web Shell
application and run the command inside the web shell
paplay /usr/share/sounds/alsa/Rear_Center.wav \n
You should heard Rear Center
on your local sound device
Open a Terminal Web Shell
application and run the command inside the web shell
pavumeter --record\n
You should see cursor changes if you talk to your abcdesktop
"},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"Open the web browser's console log to read the WebRTC messages
Read the json rtc_configuration document created by pyos pod
Read the step Created peer connection for call and creating SDP
and step Exchange from foundation
for 1 to 6
Read the step Exchange from foundation
from 6 to 9
Read the step Local stream answer
The last line is ICE Candidate was null, done
The sound is now enabled
"},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.
"},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"These commands install the latest Kubernetes on a single node Ubuntu 22.04. km
is a command tools from https://github.com/jfv-opensource/kube-tools repository.
Clone kube-tools and run km --apply
as root.
git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n
kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.
Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309: retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.
The abcdesktop infrastructure is using the contianers :
Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"You need to have a
kubectl
or microk8s
command-line tool must be configured to communicate with your cluster. openssl
and curl
command line must be installed too.You can run the Quick installation process or choose the Manually installation step by step
Linux operating system is recommanded to run abcdesktop.io.
"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows
"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"Quick installation can be run on Linux or macOS operation system.
Download and extract the latest release automatically (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n
You can read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-6dt28 1/1 Running 0 40s\nmongodb-od-77c945467d-r82kv 1/1 Running 0 40s\nnginx-od-7445969696-6z88w 1/1 Running 0 40s\nopenldap-od-5bbdd75864-d5bpq 1/1 Running 0 38s\npyos-od-7584db6787-vnp64 1/1 Running 0 39s\nspeedtest-od-7f5484966f-jsb2m 1/1 Running 0 39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:
abcdesktop
namespacersa
keys pairs for jwt signing and payload encryptionod.config
services
, deployments
, secrets
and configmaps
You may need to replace the default namespace abcdesktop
by your own during the install process. The install-3.2.sh
bash script allow you to set the new namespace as an option.
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n
Run install-3.2.sh
./install-3.2.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-b75fb 1/1 Running 0 20s\nmongodb-od-77c945467d-t8cv7 1/1 Running 0 20s\nnginx-od-b8c8c7b95-lkjl6 1/1 Running 0 20s\nopenldap-od-56b6564c85-2npln 1/1 Running 0 18s\npyos-od-67dfc48d84-kww9n 1/1 Running 0 20s\nspeedtest-od-894b7c886-69vc4 1/1 Running 0 20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.
"},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"We will create the abcdesktop namespace and set it as default :
kubectl create namespace abcdesktop\n
You should read on the standard output
namespace/abcdesktop created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.
Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.
The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.
The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.
As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.
The abcdesktop jwt desktop payload public key is read by nginx lua script
. The exported the public key need the RSAPublicKey_out
option, to use the RSAPublicKey
format. The RSAPublicKey
format make key file format compatible between python 3.x jwt module
and lua jwt lib
.
The following commands will let you create all necessary keys :
openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n
Then, create the kubernetes secrets from the new key files:
kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n
You should read on the standard output :
secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"You can verify secrets creation with the following command :
kubectl get secrets -n abcdesktop\n
You should read on the standard output :
NAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 68s\nabcdesktopjwtdesktopsigning Opaque 2 68s\nabcdesktopjwtusersigning Opaque 2 67s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"Create a pod user to make sure that Kubernetes will find the docker images at startup time.
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
You should read on stdout
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n
You can wait for user pod is Ready
, this while take a while, for container images are downloading.
kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n
You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5
. The container images are downloaded.
kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"Download the od.config file. This is the main configuration file for pyos
control plane.
curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n
Create the config map abcdesktop-config
in the abcdesktop
namespace
kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n
You should read on sdtout
configmap/abcdesktop-config created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.
Run the command line
kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n
You should read on the standard output
role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"Once the pods are created, all pods should be in Running
status. For the first time, please wait for downloading all container images. It can take a while.
kubectl get pods -n abcdesktop\n
You should read on the standard output
NAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 18s\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 18s\nnginx-od-7445969696-mwlc9 1/1 Running 0 18s\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 18s\npyos-od-7584db6787-tjlvk 1/1 Running 0 18s\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 18s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your navigator to http://[your-ip-hostname]:30443/
abcdesktop homepage should be available :
Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.
Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.
Also, you can run again the command
kubectl get pods -n abcdesktop\n
You should see that the anonymous-XXXXX
pod have been created and is Running
NAME READY STATUS RESTARTS AGE\nanonymous-50b0f 4/4 Running 0 5m22s\nmemcached-od-5ff8844d56-jv4bh 1/1 Running 0 77m\nmongodb-od-77c945467d-9xbnw 1/1 Running 0 77m\nnginx-od-7445969696-mwlc9 1/1 Running 0 77m\nopenldap-od-5bbdd75864-c6th9 1/1 Running 0 77m\npyos-od-7584db6787-tjlvk 1/1 Running 0 77m\nspeedtest-od-7f5484966f-cxwpr 1/1 Running 0 77m\n
Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"Quick installation can be run on Linux or macOS operation system.
Download and execute the pullapps-3.2.sh
script :
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n
This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 100m\ndaemonset-pyos-rdwws 1/1 Running 0 100m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 100m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 100m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 1/1 Running 0 3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 0/1 ContainerCreating 0 1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 0/1 ContainerCreating 0 0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 0/1 ContainerCreating 0 2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 1/1 Running 0 3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 1/1 Running 0 4s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 100m\n
list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"Quick installation can be run on Windows operation system.
Download and execute the pullapps-3.2.ps1
script :
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"Add new application, require to send an application json document to the control-plane pyos
.
In this example, we install the application 2048
game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2
curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.2.json --output 2048.json\n
To inspect image json you can also run crictl inspecti
or docker inspect
command.
crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
docker inspect abcdesktopio/2048.d:3.2 > 2048.json
The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image
Replace [your-ip-hostname]
by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image
Send the 2048.json
file to the images REST endpoint
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n
The response is the json document.
[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods
description for /API/manager/image
","text":"Method Type GET
http request list images in mongo db image
collection PUT
http request update or insert images in mongo db image
collection, then create a pull pod to fetch images POST
http request update or insert images in mongo db image
collection. This method does not pull images. DELETE
http request delete images in mongo db image
collection Method Sample GET
curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
PUT
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
POST
curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
DELETE
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
The PUT
method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID
pod exists
kubectl get pods -n abcdesktop\n
The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274
is ContainerCreating
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 0/1 ContainerCreating 0 2s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
Then the pod STATUS
become Running
during 42 seconds
.
NAME READY STATUS RESTARTS AGE\ndaemonset-nginx-dqxzx 1/1 Running 0 32m\ndaemonset-pyos-rdwws 1/1 Running 0 32m\nmemcached-od-bdcbbcb74-xbg8x 1/1 Running 0 32m\nmongodb-od-6484d8bc67-9xsgm 1/1 Running 0 32m\nopenldap-od-795c55f6db-pb68k 1/1 Running 0 32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 1/1 Running 0 80s\nspeedtest-od-5565dfdc67-vdwcl 1/1 Running 0 32m\n
This pod is created to ask Kubernetes for pulling the container image.
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.
Now reconnect to your abcdesktop.
Open your navigator to http://[your-ip-hostname]:30443/
http://localhost:30443/\n
The new applications are installed, and ready to run.
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"Quick installation can be run on Windows operation system.
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"To run abcdesktop on Microsoft Windows plateform you need to use docker desktop
Start Docker Desktop
and wait for the docker engine to start.
Once started go to the Settings | Kubernetes
and click on Enable Kubernetes
, starting your cluster may take a while.
Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version
kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"abcdesktop install process creates RSA keys using openssl, you need to install openssl
command line.
Download the OpenSSL v3.2.0 Light executable file.
Then follow the install process.
Make sure to keep in mind the path where OpenSSL will be installed.
Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".
Go to the system variables section and search for Path
Click on Edit
and add a new Path
, you have to paste the absolute path to the bin folder of OpenSSL.
Now OpenSSL
should be correctly installed, you can check it by opening a new PowerShell and run the command
openssl version\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"Download and extract the latest release automatically (Windows):
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n
You should read on stdout
[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-x89kq 1/1 Running 0 11s\nmongodb-od-77c945467d-c5cw4 1/1 Running 0 11s\nnginx-od-86c5dfcc67-nfvbq 1/1 Running 0 11s\nopenldap-od-5bbdd75864-mzzmh 1/1 Running 0 11s\npyos-od-7646bf4786-c2hdm 1/1 Running 0 11s\nspeedtest-od-7f5484966f-6t4b2 1/1 Running 0 11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
You can open a web browser and go to the http://localhost:30443/
"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"You may need to replace the default namespace abcdesktop
by your own. The install-3.2.ps1
PowerShell script allows you to set the new namespace as an option.
curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/install-3.2.ps1 -OutFile install-3.2.ps1\n
Run install-3.2.ps1
.\\install-3.2.ps1 --namespace superdesktop\n
You should read on stdout
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME READY STATUS RESTARTS AGE\nmemcached-od-5ff8844d56-98t4t 1/1 Running 0 23s\nmongodb-od-77c945467d-v4k58 1/1 Running 0 23s\nnginx-od-7c7bf5bf48-khtvg 1/1 Running 0 23s\nopenldap-od-56b6564c85-t56tj 1/1 Running 0 21s\npyos-od-644c98bcd5-8gqzd 1/1 Running 0 23s\nspeedtest-od-894b7c886-fgt6v 1/1 Running 0 23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
You can open a web browser and go to the http://localhost:30443/
"},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"Uninstall abcdesktop for kubernetes
"},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"To uninstall abcdesktop. Choose run run the uninstall-3.2.sh
bash script using a curl.
If you are using a Windows operating system please click on the link below Quick uninstall for windows
"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"Quick uninstallation can be run on Linux or macOS operation system.
Download and extract the uninstall bash script (Linux or macOS):
curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n
You should read on stdout
abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n
Please wait for the output message:
[OK] namespace \"abcdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes.
"},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n
Run the uninstall-3.2.sh
command line with your own namespace
./uninstall-3.2.sh --namespace superdesktop\n
You should read on stdout
abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n
Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.
"},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"Quick uninstallation can be run on Windows operation system.
Download and extract the uninstall PowerShell script (Windows):
$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
You should read on stdout
[INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n
Run the uninstall-3.2.ps1
command line with your own namespace
.\\uninstall-3.2.ps1 --namespace superdesktop\n
You should read on stdout
[INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":"Alexandre DEVELY : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base
Cedric HAUWEL : Control Plane PyOS
and authentification, included a complete refactor of the control plane
Jeremy PETIT : HTML, CSS, Javascript, nodejs: Full Stack Javascript Developer
Kevin VOYER : HTML, CSS, Javascript, Firefox clipboard extension, nodejs : Full Stack Javascript Developer
Vincent PENVERN : Python, Ansible, Firefox clipboard extension, Pyos and embedded applications
Jean-Philippe XAVIER: Architect, design and network policies with calico
The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log
for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.
Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
"},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
"},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
"},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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 \u201cAS IS\u201d 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.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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.
END OF TERMS AND CONDITIONS
"},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"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 convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year> <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n
The hypothetical commands show w
and show c
should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w
and show c
; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n
This 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.
"},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.
We recommend you to start in docker mode
first with the Setup Guide in docker mode.
Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide
You can also, read the genesis chapters GUI apps on Docker
.
Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.
"},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.
Topics include:
This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.
Topics include:
abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :
Operating System Recommended versionGNU/Linux
Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X
Catalina version 10.15.3 (and above) Windows 10
Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop
or server
","text":"server
, please translate the URL
request http://localhost
with the hostname of your server. For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL
request http://localhost
with http://server01.labs.domain.local
Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.
desktop
, the URL
request http://localhost
will reach your local services.abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.
Follow the Fork me on github links, to get access to each repository.
If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.
"},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"abcdesktop.io deplend on a lot of open source diffrents projets.
"},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.
As VNC does not support sound, we have to forward a Pulseaudio null-sink
output to the user browser, with no latency.
Release 1.0 : use the pulseaudio http stream and play wave data (poor sound quality but works in https only)
Release 2.0 : use janus webrtc gateway, send pulseaudio rtp stream to janus, and play sound using the web browser webrtc stack (good sound quality)
Release 3.0 : use virtual microphone using gstreamer and pulseaudio
Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented
"},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"webaudio-wav-stream-player No latency wav stream player using browser fetch streaming API and WebAudio
Pulseaudio with module-http-protocol-tcp A proof-of-concept HTTP module, which can be used to introspect the current status of the PulseAudio daemon using HTTP. Just load this module and point your browser to http://localhost:4714/. This module takes the same arguments as module-cli-protocol-tcp.
Create Pulseaudio null-sink
# defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n
Then use
load-module module-http-protocol-tcp\n
Read the http stream data, using fetch call :
$target
is the container Ip Address$pulseaudio_http_port
is the pulseaudio http port ( by default, the http port vallue ishttp://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n
Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js
file :
//\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n // // total header : 4 + 26 + 12 + 8 = 50 \n // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n var total_length = header_length + data.byteLength;\n\n // bitsPerSample MUST BE 8 bits\n\n // The default byte ordering assumed for WAVE data files is little-endian.\n var header = new ArrayBuffer(header_length); \n var d = new DataView(header);\n\n d.setUint8(0, \"R\".charCodeAt(0)); \n d.setUint8(1, \"I\".charCodeAt(0));\n d.setUint8(2, \"F\".charCodeAt(0));\n d.setUint8(3, \"F\".charCodeAt(0));\n\n // All integers MUST be set in bigEndian format\n // Wave chunks containing format information and sampled data\n // cksize 4 Chunk size: 4+n \n // 4: for sizeof( 'WAVE' ) + n \n // n: Wave chunks containing format information and sampled data\n //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n //bitsPerSample data.byteLength + 8+16+12\n d.setUint32(4, total_length, true); \n\n // write 4 bytes\n d.setUint8(8, \"W\".charCodeAt(0)); \n d.setUint8(9, \"A\".charCodeAt(0)); \n d.setUint8(10, \"V\".charCodeAt(0)); \n d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n // write 4 bytes\n d.setUint8(12, \"f\".charCodeAt(0));\n d.setUint8(13, \"m\".charCodeAt(0));\n d.setUint8(14, \"t\".charCodeAt(0));\n d.setUint8(15, \" \".charCodeAt(0));\n\n\n // All integers MUST be set in bigEndian format\n\n\n // Subchunk1Size 16 for PCM. \n // Offset 16 \n // Size 4\n // This is the size of the rest of the Subchunk which follows this number.\n // The size of the rest of this subchunk.\n // All integers MUST be set in bigEndian format\n // d.setUint32(16, 16, true);\n // cksize 4 Chunk size: 16, 18 or 40 \n var chunksize = 18;\n d.setUint32(16, chunksize, true);\n\n // The format of the wave data, which will be 1 for uncompressed PCM data.\n // All integers MUST be set in bigEndian format\n // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n d.setUint16(20, format, true);\n\n // Indicates if the data is mono, stereo, or something else.\n // NumChannels Mono = 1, Stereo = 2, etc.\n // All integers MUST be set in bigEndian format\n d.setUint16(22, numberOfChannels, true);\n\n // The sample rate per second.\n // SampleRate 8000, 44100, etc.\n // All integers MUST be set in bigEndian format\n d.setUint32(24, sampleRate, true);\n\n // byteRate == SampleRate * NumChannels * BitsPerSample/8\n // All integers MUST be set in bigEndian format\n var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n d.setUint32(28, byteRate, true ); \n\n // blockAlign == NumChannels * BitsPerSample/8\n // The number of bytes for one sample including all channels.\n var blockAlign = numberOfChannels * bitsPerSample / 8; \n // All integers MUST be set in bigEndian format\n d.setUint16(32, blockAlign, true ); \n\n // BitsPerSample 8 bits = 8, 16 bits = 16, etc.\n d.setUint16(34, bitsPerSample, true);\n\n // Wave files may include an additional field, usually reserved for non-PCM formats:\n // bits per Sample \n // Size of the extension \n // 2 bytes\n // Offset \n var cbSize = 0;\n d.setUint16(36, cbSize, true);\n\n d.setUint8(38, \"f\".charCodeAt(0));\n d.setUint8(39, \"a\".charCodeAt(0));\n d.setUint8(40, \"c\".charCodeAt(0));\n d.setUint8(41, \"t\".charCodeAt(0));\n var cksize = 4;\n d.setUint32(42, cksize, true);\n var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n d.setUint32(46, dwSampleLength, true);\n\n// 50\n d.setUint8(50, \"d\".charCodeAt(0));\n d.setUint8(51, \"a\".charCodeAt(0));\n d.setUint8(52, \"t\".charCodeAt(0));\n d.setUint8(53, \"a\".charCodeAt(0));\n\n d.setUint32(54, data.byteLength, true);\n\n//58\n // data must pad byte 0 or 1 if n is odd\n return concat(header, data);\n}\n
Then use the WavPlayer.js
from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()
This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10
It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.
"},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"Janus WebRTC Gateway with ICE server. Janus act as WebRTC gateway, listen for udp RTP stream from Pulseaudio and forward it to user web browser.
Pulseaudio with module-rtp-send Create a null-sink formated alaw and send it to the WebRTC gateway udp port on localhost.
### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n
Add a RTP stream to Janus WebRTC gateway
[pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n
Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC
"},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"The current documentation version is 0.1
"},{"location":"about/version/#location","title":"Location","text":"This documentation is located at https://github.com/abcdesktopio/docs
"},{"location":"about/version/#installing-make","title":"Installing Make","text":"Install the Make package using apt-get
sudo apt-get install make\n
"},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"Install the mkdocs package using the Makefile
:
make install\n
make install
command runs :
Make sure that the pip command is installed on you system.
"},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO - Cleaning site directory \nINFO - Building documentation to directory: /home/alex/src/docs/opsdocs/site \n
All HTML files are located in the building documentation directory
"},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"make serve\nINFO - Serving on http://127.0.0.1:8000\nINFO - Start watching changes\nINFO - Start detecting changes\n
Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.
"},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"{\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}
https://ocv5.pepins.net/API/composer/launchdesktop
{\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}
"},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/
"},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"DockerFile generator from json file to build applications images run commands
$ make dockerfile\n$ make build\n
this command build all generated Dockerfile
To build documentation files
$ make docs\n
this command build all md files, and build list.md
"},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"gnome-2048\n
"},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"2048 (alpine gtk) with error\n
"},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"org.gnome.TwentyFortyEight.Gnome-2048\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"pod_application\",\n \"apkpackage\": \"gnome-2048\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n \"name\": \"2048-alpine-error\",\n \"displayname\": \"2048 (alpine gtk) with error\",\n \"path\": \"/usr/bin/gnome-2048\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n }\n}\n
"},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-alpine-error
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
"},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
"},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"gnome-2048\n
"},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"2048 (alpine gtk)\n
"},{"location":"applications/2048-alpine/#path","title":"Path","text":"/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"org.gnome.TwentyFortyEight.Gnome-2048\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"json source file 2048-alpine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"ephemeral_container\",\n \"apkpackage\": \"gnome-2048\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n \"name\": \"2048-alpine\",\n \"displayname\": \"2048 (alpine gtk)\",\n \"path\": \"/usr/bin/gnome-2048\",\n \"showinview\": \"dock\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"64M\",\n \"pid_mode\": false,\n \"network_mode\": \"none\"\n }\n}\n
"},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
"},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-alpine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
"},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
"},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
"},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"2048-qt\n
"},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"2048 (ubuntu qt)\n
"},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"/usr/games/2048-qt\n
"},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"2048-qt.2048-qt\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/2048-qt.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
ENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"json source file 2048-ubuntu.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"containerengine\": \"pod_application\",\n \"debpackage\": \"2048-qt\",\n \"icon\": \"circle_2048.svg\",\n \"keyword\": \"2048\",\n \"launch\": \"2048-qt.2048-qt\",\n \"name\": \"2048-ubuntu\",\n \"displayname\": \"2048 (ubuntu qt)\",\n \"path\": \"/usr/games/2048-qt\",\n \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"postruncommands\": [\n \"ENV QT_X11_NO_MITSHM=1\"\n ]\n}\n
"},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
"},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application 2048-ubuntu
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
"},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
"},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
"},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"2048-qt
"},{"location":"applications/2048/#display-name","title":"Display name","text":"\"2048\"
"},{"location":"applications/2048/#path","title":"path","text":"\"/usr/games/2048-qt\"
"},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.22.04
"},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
"},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"
Apache Directory Studio\n
"},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
"},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"Apache Directory Studio.Apache Directory Studio\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
"},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"json source file apachedirectorystudio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n ],\n \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n \"icon\": \"account.svg\",\n \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n \"installrecommends\": true,\n \"keyword\": \"ldap\",\n \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n \"name\": \"apachedirectorystudio\",\n \"displayname\": \"Apache Directory Studio\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
"},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
"},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application apachedirectorystudio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
"},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
"},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
"},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"astromenace\n
"},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"astromenace\n
"},{"location":"applications/astromenace/#path","title":"Path","text":"/usr/games/AstroMenace\n
"},{"location":"applications/astromenace/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"Astromenace.Astromenace\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/astromenace.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"json source file astromenace.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"astromenace\",\n \"installrecommends\": true,\n \"icon\": \"astromenace.svg\",\n \"launch\": \"Astromenace.Astromenace\",\n \"name\": \"astromenace\",\n \"displayname\": \"astromenace\",\n \"path\": \"/usr/games/AstroMenace\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
"},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
"},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application astromenace
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
"},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
"},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
"},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"libxss1 atom aspell
"},{"location":"applications/atom/#arguments","title":"Arguments","text":"\"-f\"
"},{"location":"applications/atom/#display-name","title":"Display name","text":"\"Atom\"
"},{"location":"applications/atom/#path","title":"path","text":"\"/usr/bin/atom\"
"},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"\nRUN apt-get update && apt-get install --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/base/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/base/#arguments","title":"Arguments","text":"\"--base\"
Base\n
"},{"location":"applications/base/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/base/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
"},{"location":"applications/base/#file-extensions","title":"File extensions","text":"\"odb\"
\"odb\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-base\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-base.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/base/#json-dump","title":"JSON dump","text":"json source file base.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_base.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-base\",\n \"name\": \"base\",\n \"displayname\": \"Base\",\n \"args\": \"--base\",\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n \"fileextensions\": \"odb\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"legacyfileextensions\": \"odb\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
"},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application base
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
"},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f base.d -t base .\n
"},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
"},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"\"--no-sandbox\"
Beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"/opt/Beekeeper-Studio/beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"\"sql\"
\"sql\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"beekeeper-studio.beekeeper-studio\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/beekeeper-studio.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"json source file beekeeperstudio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\",\n \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n \"ENV ELECTRON_ENABLE_LOGGING=true\",\n \"ENV QT_X11_NO_MITSHM=1\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"beekeeper-studio.svg\",\n \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n \"launch\": \"beekeeper-studio.beekeeper-studio\",\n \"name\": \"beekeeperstudio\",\n \"displayname\": \"Beekeeper-studio\",\n \"installrecommends\": false,\n \"forceconfold\": true,\n \"host_config\": {\n \"shm_size\": \"2G\",\n \"ipc_mode\": \"shareable\"\n },\n \"args\": \"--no-sandbox\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"legacyfileextensions\": \"sql\",\n \"fileextensions\": \"sql\",\n \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
"},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application beekeeperstudio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
"},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
"},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
"},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/blender/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"blender mesa-dri-gallium\n
"},{"location":"applications/blender/#displayname","title":"Displayname","text":"Blender\n
"},{"location":"applications/blender/#path","title":"Path","text":"/usr/bin/blender\n
"},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"application/x-blender\n
"},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"\"blend,obj,fbx,3ds,ply,stl\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"Blender.Blender\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/blender.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"json source file blender.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,graphics\",\n \"apkpackage\": \"blender mesa-dri-gallium\",\n \"icon\": \"circle_blender.svg\",\n \"keyword\": \"blender,modeler\",\n \"launch\": \"Blender.Blender\",\n \"name\": \"blender\",\n \"displayname\": \"Blender\",\n \"path\": \"/usr/bin/blender\",\n \"mimetype\": \"application/x-blender\",\n \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
"},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
"},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application blender
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
"},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
"},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
"},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/bless/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"bless\n
"},{"location":"applications/bless/#path","title":"Path","text":"/usr/bin/bless\n
"},{"location":"applications/bless/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"bless.Bless\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/bless.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"json source file bless.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"bless\",\n \"icon\": \"circle_bless.svg\",\n \"keyword\": \"hexa,decimal\",\n \"launch\": \"bless.Bless\",\n \"name\": \"Bless\",\n \"path\": \"/usr/bin/bless\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
"},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
"},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Bless
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
"},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
"},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
"},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/blobby/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"blobby\n
"},{"location":"applications/blobby/#path","title":"Path","text":"/usr/games/blobby\n
"},{"location":"applications/blobby/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"blobby.blobby\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/blobby.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"json source file blobby.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"blobby\",\n \"icon\": \"blobby.svg\",\n \"installrecommends\": false,\n \"keyword\": \"game\",\n \"launch\": \"blobby.blobby\",\n \"name\": \"blobby\",\n \"path\": \"/usr/games/blobby\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
"},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
"},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application blobby
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
"},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
"},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
"},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/boxes/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"gnome-boxes sudo\n
"},{"location":"applications/boxes/#displayname","title":"Displayname","text":"Gnome-boxes\n
"},{"location":"applications/boxes/#path","title":"Path","text":"/usr/bin/gnome-boxes\n
"},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"application-x-cd-image;\n
"},{"location":"applications/boxes/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"gnome-boxes.Gnome-boxes\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Boxes.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"json source file boxes.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"org.gnome.Boxes.svg\",\n \"apkpackage\": \"gnome-boxes sudo\",\n \"keyword\": \"boxes,vm\",\n \"launch\": \"gnome-boxes.Gnome-boxes\",\n \"name\": \"boxes\",\n \"displayname\": \"Gnome-boxes\",\n \"path\": \"/usr/bin/gnome-boxes\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n \"mimetype\": \"application-x-cd-image;\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"securitycontext\": {\n \"allowPrivilegeEscalation\": true,\n \"capabilities\": {\n \"add\": [\n \"NET_ADMIN\",\n \"CAP_SYS_ADMIN\"\n ]\n }\n }\n}\n
"},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
"},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application boxes
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
"},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
"},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
"},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/brackets/#arguments","title":"Arguments","text":"\"--no-sandbox --disable-gpu\"
/opt/brackets/Brackets\n
"},{"location":"applications/brackets/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"brackets.Brackets\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/opt/brackets/brackets.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"json source file brackets.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"\",\n \"icon\": \"circle_brackets.svg\",\n \"keyword\": \"html,brackets\",\n \"launch\": \"brackets.Brackets\",\n \"name\": \"Brackets\",\n \"path\": \"/opt/brackets/Brackets\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"host_config\": {\n \"mem_limit\": \"512M\"\n },\n \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"args\": \"--no-sandbox --disable-gpu\"\n}\n
"},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
"},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Brackets
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
"},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
"},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
"},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/calc/#distribution","title":"Distribution","text":"alpine
"},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/calc/#arguments","title":"Arguments","text":"\"--calc\"
"},{"location":"applications/calc/#displayname","title":"Displayname","text":"\"Calc\"
"},{"location":"applications/calc/#path","title":"Path","text":"\"/usr/lib/libreoffice/program/soffice\"
"},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/calc/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"
"},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"
"},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"\"ods;ots;csv\"
"},{"location":"applications/calc/#acl","title":"ACL","text":"{\"permit\":[\"all\"]}
"},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-calc
"},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"/usr/share/applications/libreoffice-calc.desktop
"},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_calc.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-calc\",\n \"name\": \"calc\",\n \"displayname\": \"Calc\",\n \"showinview\": \"dock\",\n \"args\": \"--calc\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n \"legacyfileextensions\": \"ods;ots;csv\",\n \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/calculator/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"gnome-calculator\n
"},{"location":"applications/calculator/#path","title":"Path","text":"/usr/bin/gnome-calculator\n
"},{"location":"applications/calculator/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"gnome-calculator.gnome-calculator\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Calculator.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"json source file calculator.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"apkpackage\": \"gnome-calculator\",\n \"icon\": \"gnome_calculator.svg\",\n \"keyword\": \"calculator\",\n \"launch\": \"gnome-calculator.gnome-calculator\",\n \"name\": \"calculator\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-calculator\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
"},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
"},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application calculator
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
"},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
"},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
"},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/chess/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"gnuchess gnome-chess\n
"},{"location":"applications/chess/#path","title":"Path","text":"/usr/bin/gnome-chess\n
"},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"application/x-chess-pgn\n
"},{"location":"applications/chess/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"gnome-chess.gnome-chess\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Chess.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"json source file chess.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnuchess gnome-chess\",\n \"icon\": \"circle_chess.svg\",\n \"keyword\": \"chess gnuchess\",\n \"launch\": \"gnome-chess.gnome-chess\",\n \"name\": \"chess\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-chess\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-chess-pgn\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
"},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
"},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chess
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
"},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
"},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
"},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/chrome/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
"},{"location":"applications/chrome/#displayname","title":"Displayname","text":"Chrome\n
"},{"location":"applications/chrome/#path","title":"Path","text":"/usr/bin/google-chrome-stable\n
"},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"google-chrome.Google-chrome\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/google-chrome.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
"},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"json source file chrome.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n \"preruncommands\": [\n \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n ],\n \"icon\": \"circle_google-chrome.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"google-chrome.Google-chrome\",\n \"name\": \"chrome\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"Chrome\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/google-chrome-stable\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
"},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chrome
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
"},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
"},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
"},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/chromium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"chromium\n
"},{"location":"applications/chromium/#displayname","title":"Displayname","text":"chromium (alpine)\n
"},{"location":"applications/chromium/#path","title":"Path","text":"/usr/bin/chromium-browser\n
"},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"chromium.Chromium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/chromium-browser.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"json source file chromium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"chromium\",\n \"icon\": \"circle_chromium.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"chromium.Chromium\",\n \"name\": \"chromium\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"chromium (alpine)\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/chromium-browser\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
"},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application chromium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
"},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
"},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
"},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/citrix/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
"},{"location":"applications/citrix/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/citrix/#arguments","title":"Arguments","text":"\"-icaroot /opt/Citrix/ICAClient\"
citrix-client\n
"},{"location":"applications/citrix/#path","title":"Path","text":"/opt/Citrix/ICAClient/wfica\n
"},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"application/x-ica;\n
"},{"location":"applications/citrix/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"Wfica.Wfica\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/wfica.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"json source file citrix.d.3.0.json
{\n \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"postruncommands\": [\n \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n \"icon\": \"icaclient.svg\",\n \"keyword\": \"ica,icaclient,\",\n \"launch\": \"Wfica.Wfica\",\n \"name\": \"citrix\",\n \"displayname\": \"citrix-client\",\n \"secrets_requirement\": \"citrix\",\n \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n \"path\": \"/opt/Citrix/ICAClient/wfica\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"mimetype\": \"application/x-ica;\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"512M\",\n \"pid_mode\": true,\n \"ipc_mode\": \"shareable\"\n },\n \"usedefaultapplication\": true,\n \"licence\": \"non-free\"\n}\n
"},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
"},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application citrix
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
"},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
"},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
"},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"cf8-cli\n
"},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"\"--disable-factory --class pivotalio.cf\"
Cloud Foundry cli\n
"},{"location":"applications/cloudfoundry/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.pivotalio.cf\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
"},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"json source file cloudfoundry.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n ],\n \"debpackage\": \"cf8-cli\",\n \"icon\": \"pivotalio-icon.svg\",\n \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n \"name\": \"cloudFoundry\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"displayname\": \"Cloud Foundry cli\",\n \"args\": \"--disable-factory --class pivotalio.cf\",\n \"quick\": true\n}\n
"},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
"},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cloudFoundry
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
"},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
"},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
"},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"cmd.exe wine (alpine)\n
"},{"location":"applications/cmd.exe/#path","title":"Path","text":"/usr/bin/wineconsole\n
"},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"conhost.exe.conhost.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"json source file cmd.exe.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"cmd.svg\",\n \"keyword\": \"wine,command,cmd.exe\",\n \"launch\": \"conhost.exe.conhost.exe\",\n \"name\": \"cmd.exe\",\n \"displayname\": \"cmd.exe wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/wineconsole\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
"},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cmd.exe
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
"},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
"},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
"},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
"},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"
cntlm\n
"},{"location":"applications/cntlm/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cntlm/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cntlm\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
COPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
"},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
"},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n \"icon\": \"cntlm.svg\",\n \"keyword\": \"cntlm,proxy,ntlm\",\n \"launch\": \"gnome-terminal-server.cntlm\",\n \"name\": \"cntlm\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"displayname\": \"cntlm\",\n \"host_config\": {\n \"network_mode\": \"container\"\n },\n \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n \"preruncommands\": [\n \"COPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\",\n \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n ],\n \"postruncommands\": [\n \"RUN chown balloon:root /etc/cntlm.conf\",\n \"RUN chmod 755 /composer/cntlm.mustache\"\n ]\n}\n
"},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cntlm
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
"},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
"},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"libgl1 corsix-th\n
"},{"location":"applications/corsix-th/#path","title":"Path","text":"/usr/games/corsix-th\n
"},{"location":"applications/corsix-th/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"corsix-th.corsix-th\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/com.corsixth.CorsixTH.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
"},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"json source file corsix-th.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n \"RUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n ],\n \"debpackage\": \"libgl1 corsix-th\",\n \"icon\": \"games.svg\",\n \"keyword\": \"hospital,role,playing\",\n \"launch\": \"corsix-th.corsix-th\",\n \"name\": \"corsix-th\",\n \"path\": \"/usr/games/corsix-th\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
"},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
"},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer && curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application corsix-th
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
"},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
"},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
"},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cuda/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git\n
"},{"location":"applications/cuda/#arguments","title":"Arguments","text":"\"--disable-factory --class=cuda\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cuda/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cuda\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"json source file cuda.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia\",\n \"launch\": \"gnome-terminal-server.cuda\",\n \"name\": \"cuda\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cuda\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
"},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cuda
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
"},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
"},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
"},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"
cuda demo\n
"},{"location":"applications/cudademo/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cudademo/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cudademo\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"json source file cudademo.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia\",\n \"launch\": \"gnome-terminal-server.cudademo\",\n \"name\": \"cudademo\",\n \"displayname\": \"cuda demo\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
"},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cudademo
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
"},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
"},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
"},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"\"--disable-factory --class=cudadev\"
cuda developper\n
"},{"location":"applications/cudadev/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/cudadev/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.cudadev\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
"},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
"},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"json source file cudadev.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [],\n \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n \"icon\": \"nvidia.svg\",\n \"keyword\": \"cuda nvidia dev\",\n \"launch\": \"gnome-terminal-server.cudadev\",\n \"name\": \"cudadev\",\n \"displayname\": \"cuda developper\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=cudadev\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n ]\n}\n
"},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
"},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application cudadev
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
"},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
"},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
"},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/dia/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"dia dia-lang\n
"},{"location":"applications/dia/#path","title":"Path","text":"/usr/bin/dia\n
"},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"application/x-dia-diagram;\n
"},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"\"dia\"
\"dia\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"dia-gnome.Dia-gnome\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/dia.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"json source file dia.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"dia dia-lang\",\n \"installrecommends\": true,\n \"icon\": \"circle_dia.svg\",\n \"launch\": \"dia-gnome.Dia-gnome\",\n \"name\": \"Dia\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/dia\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-dia-diagram;\",\n \"fileextensions\": \"dia\",\n \"legacyfileextensions\": \"dia\",\n \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
"},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
"},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Dia
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
"},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
"},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
"},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/doom/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
"},{"location":"applications/doom/#displayname","title":"Displayname","text":"Doom\n
"},{"location":"applications/doom/#path","title":"Path","text":"/usr/games/doom\n
"},{"location":"applications/doom/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"chocolate-doom.chocolate-doom\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file doom.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n \"icon\": \"doom.svg\",\n \"keyword\": \"doom\",\n \"launch\": \"chocolate-doom.chocolate-doom\",\n \"name\": \"doom\",\n \"displayname\": \"Doom\",\n \"path\": \"/usr/games/doom\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
"},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application doom
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
"},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
"},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
"},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/draw/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/draw/#arguments","title":"Arguments","text":"\"--draw\"
Draw\n
"},{"location":"applications/draw/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/draw/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
"},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"\"odp;otg\"
\"odp;otg\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-draw\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-draw.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"json source file draw.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_draw.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-draw\",\n \"name\": \"draw\",\n \"displayname\": \"Draw\",\n \"showinview\": \"dock\",\n \"args\": \"--draw\",\n \"uniquerunkey\": \"libreoffice\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n \"fileextensions\": \"odp;otg\",\n \"legacyfileextensions\": \"odp;otg\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
"},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application draw
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
"},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
"},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
"},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/drawio/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
"},{"location":"applications/drawio/#displayname","title":"Displayname","text":"draw.io\n
"},{"location":"applications/drawio/#path","title":"Path","text":"/opt/drawio/drawio\n
"},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"application/vnd.jgraph.mxfile;application/vnd.visio;\n
"},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"\"drawio\"
\"drawio\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"draw.io.draw.io\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/drawio.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"json source file drawio.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n \"icon\": \"circle_drawio.svg\",\n \"launch\": \"draw.io.draw.io\",\n \"name\": \"drawio\",\n \"displayname\": \"draw.io\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/opt/drawio/drawio\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n \"fileextensions\": \"drawio\",\n \"legacyfileextensions\": \"drawio\",\n \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n \"postruncommands\": [\n \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n ]\n}\n
"},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
"},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application drawio
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
"},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
"},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
"},{"location":"applications/dummy/","title":"Dummy","text":"dummy
"},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.eclipse
"},{"location":"applications/eclipse/#display-name","title":"Display name","text":"\"Eclipse\"
"},{"location":"applications/eclipse/#path","title":"path","text":"\"/usr/bin/eclipse\"
"},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.sts4
"},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"\"Eclipse Sts4\"
"},{"location":"applications/eclipse_sts4/#path","title":"path","text":"\"/opt/sts/SpringToolSuite4\"
"},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/edge/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"microsoft-edge-stable\n
"},{"location":"applications/edge/#displayname","title":"Displayname","text":"Microsoft Edge\n
"},{"location":"applications/edge/#path","title":"Path","text":"/usr/bin/microsoft-edge-stable\n
"},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
"},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"microsoft-edge.Microsoft-edge\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/microsoft-edge.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
"},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"json source file edge.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"microsoft-edge-stable\",\n \"preruncommands\": [\n \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n ],\n \"icon\": \"circle_microsoft-edge.svg\",\n \"keyword\": \"web,browser,internet\",\n \"launch\": \"microsoft-edge.Microsoft-edge\",\n \"name\": \"edge\",\n \"displayname\": \"Microsoft Edge\",\n \"path\": \"/usr/bin/microsoft-edge-stable\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
"},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application edge
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
"},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
"},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
"},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.elementary
"},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"io.elementary.terminal io.elementary.stylesheet\n
"},{"location":"applications/elementary.terminal/#path","title":"Path","text":"/usr/bin/io.elementary.terminal\n
"},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"io.elementary.terminal.Io.elementary.terminal\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/io.elementary.terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"terminal,bash,shell,cmd\",\n \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n \"name\": \"elementary.terminal\",\n \"path\": \"/usr/bin/io.elementary.terminal\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application elementary.terminal
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
"},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
"},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/eog/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"eog\n
"},{"location":"applications/eog/#path","title":"Path","text":"/usr/bin/eog\n
"},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
"},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"
\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"eog.Eog\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.eog.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"json source file eog.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"eog\",\n \"icon\": \"circle_eog.svg\",\n \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"eog.Eog\",\n \"name\": \"eog\",\n \"path\": \"/usr/bin/eog\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n \"usedefaultapplication\": true,\n \"quick\": true\n}\n
"},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
"},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application eog
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
"},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
"},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
"},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/evince/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"evince\n
"},{"location":"applications/evince/#path","title":"Path","text":"/usr/bin/evince\n
"},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
"},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"
\"pdf;ps;dvi\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"evince.Evince\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Evince.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"json source file evince.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"evince\",\n \"icon\": \"circle_acroread.svg\",\n \"keyword\": \"evince,pdf,viewer\",\n \"launch\": \"evince.Evince\",\n \"name\": \"Evince\",\n \"path\": \"/usr/bin/evince\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n \"legacyfileextensions\": \"pdf;ps;dvi\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
"},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Evince
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
"},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
"},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
"},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/evolution/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"evolution dbus-x11\n
"},{"location":"applications/evolution/#displayname","title":"Displayname","text":"Evolution\n
"},{"location":"applications/evolution/#path","title":"Path","text":"/usr/bin/evolution\n
"},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
"},{"location":"applications/evolution/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"evolution.Evolution\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Evolution.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"json source file evolution.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"evolution dbus-x11\",\n \"icon\": \"evolution.svg\",\n \"keyword\": \"evolution,mail\",\n \"launch\": \"evolution.Evolution\",\n \"name\": \"evolution\",\n \"displayname\": \"Evolution\",\n \"path\": \"/usr/bin/evolution\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
"},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
"},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application evolution
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
"},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
"},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
"},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"file-roller\n
"},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"file-roller\n
"},{"location":"applications/file-roller/#path","title":"Path","text":"/usr/bin/file-roller\n
"},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
"},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"file-roller.File-roller\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.FileRoller.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"json source file file-roller.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"file-roller\",\n \"icon\": \"circle_file-roller.svg\",\n \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n \"launch\": \"file-roller.File-roller\",\n \"name\": \"file-roller\",\n \"displayname\": \"file-roller\",\n \"path\": \"/usr/bin/file-roller\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n \"args\": \"\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
"},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application file-roller
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
"},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
"},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
"},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/filelight/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"filelight\n
"},{"location":"applications/filelight/#displayname","title":"Displayname","text":"Filelight\n
"},{"location":"applications/filelight/#path","title":"Path","text":"/usr/bin/filelight\n
"},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"inode/directory;\n
"},{"location":"applications/filelight/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"filelight.filelight\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.filelight.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"json source file filelight.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"filelight\",\n \"icon\": \"filelight.svg\",\n \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n \"launch\": \"filelight.filelight\",\n \"name\": \"filelight\",\n \"displayname\": \"Filelight\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/filelight\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"inode/directory;\",\n \"fileextensions\": \"\",\n \"args\": \"\",\n \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
"},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
"},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application filelight
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
"},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
"},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
"},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"filezilla\n
"},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"filezilla (alpine)\n
"},{"location":"applications/filezilla/#path","title":"Path","text":"/usr/bin/filezilla\n
"},{"location":"applications/filezilla/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"filezilla.Filezilla\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/filezilla.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"json source file filezilla.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"filezilla\",\n \"icon\": \"circle_filezilla.svg\",\n \"keyword\": \"ftp,client\",\n \"launch\": \"filezilla.Filezilla\",\n \"name\": \"filezilla\",\n \"displayname\": \"filezilla (alpine)\",\n \"path\": \"/usr/bin/filezilla\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
"},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
"},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application filezilla
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
"},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
"},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
"},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"firefox-esr\n
"},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"Firefox (esr alpine)\n
"},{"location":"applications/firefox-esr/#path","title":"Path","text":"/usr/bin/firefox-esr\n
"},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"\"htm;html;xml;gif\"
\"htm;html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"Navigator.firefox-esr\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox-esr.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"json source file firefox-esr.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"cat\": \"office\",\n \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n ],\n \"apkpackage\": \"firefox-esr\",\n \"icon\": \"circle_firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.firefox-esr\",\n \"name\": \"firefox-esr\",\n \"displayname\": \"Firefox (esr alpine)\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/firefox-esr\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
"},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application firefox-esr
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
"},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
"},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
"},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/firefox/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"firefox krb5\n
"},{"location":"applications/firefox/#displayname","title":"Displayname","text":"Firefox (alpine)\n
"},{"location":"applications/firefox/#path","title":"Path","text":"/usr/bin/firefox\n
"},{"location":"applications/firefox/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"\"htm;html;xml;gif\"
\"htm;html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"Navigator.firefox\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"json source file firefox.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"cat\": \"office\",\n \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n \"postruncommands\": [\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n ],\n \"apkpackage\": \"firefox krb5\",\n \"icon\": \"circle_firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.firefox\",\n \"args\": \"\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox (alpine)\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
"},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Firefox
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
"},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
"},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
"},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.firefox.rest
"},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"firefox winbind
"},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"\"--class=Rest.Firefox\"
"},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"\"Firefox-Rest\"
"},{"location":"applications/firefoxrest/#path","title":"path","text":"\"/usr/bin/firefox\"
"},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"
"},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
"},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"\"html;xml\"
"},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
"},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/flare/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"flare-game\n
"},{"location":"applications/flare/#arguments","title":"Arguments","text":"\"--game=flare-game\"
/usr/games/flare\n
"},{"location":"applications/flare/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"flare.flare\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/flare.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"json source file flare.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"flare-game\",\n \"icon\": \"flare.svg\",\n \"keyword\": \"flare-game,role,playing\",\n \"launch\": \"flare.flare\",\n \"name\": \"flare\",\n \"args\": \"--game=flare-game\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/games/flare\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
"},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
"},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application flare
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
"},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
"},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
"},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"frozen-bubble\n
"},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"frozen-bubble\n
"},{"location":"applications/frozen-bubble/#path","title":"Path","text":"/usr/games/frozen-bubble\n
"},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"perl.perl\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file frozen-bubble.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"frozen-bubble\",\n \"icon\": \"frozen-bubble.svg\",\n \"keyword\": \"frozen,bubble\",\n \"launch\": \"perl.perl\",\n \"name\": \"frozen-bubble\",\n \"displayname\": \"frozen-bubble\",\n \"path\": \"/usr/games/frozen-bubble\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
"},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application frozen-bubble
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
"},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
"},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
"},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
"},{"location":"applications/gcompris/#path","title":"Path","text":"/usr/games/gcompris-qt\n
"},{"location":"applications/gcompris/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"gcompris-qt.gcompris-qt\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file gcompris.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n \"icon\": \"gcompris.svg\",\n \"installrecommends\": true,\n \"keyword\": \"gcompris\",\n \"launch\": \"gcompris-qt.gcompris-qt\",\n \"name\": \"GCompris\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/games/gcompris-qt\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
"},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
"},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application GCompris
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
"},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
"},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
"},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/geany/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
"},{"location":"applications/geany/#displayname","title":"Displayname","text":"Geany\n
"},{"location":"applications/geany/#path","title":"Path","text":"/usr/bin/geany\n
"},{"location":"applications/geany/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
"},{"location":"applications/geany/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"geany.Geany\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/geany.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"json source file geany.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"geany.svg\",\n \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n \"keyword\": \"text,editor,geany,ide\",\n \"launch\": \"geany.Geany\",\n \"name\": \"geany\",\n \"displayname\": \"Geany\",\n \"path\": \"/usr/bin/geany\",\n \"showinview\": \"dock\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
"},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
"},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application geany
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
"},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
"},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
"},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/gedit/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"gedit\n
"},{"location":"applications/gedit/#path","title":"Path","text":"/usr/bin/gedit\n
"},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"text/plain;\n
"},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"\"txt\"
\"txt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"gedit.Gedit\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gedit.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"json source file gedit.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gedit\",\n \"icon\": \"gedit.svg\",\n \"keyword\": \"editor\",\n \"launch\": \"gedit.Gedit\",\n \"name\": \"Gedit\",\n \"path\": \"/usr/bin/gedit\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"text/plain;\",\n \"fileextensions\": \"txt\",\n \"legacyfileextensions\": \"txt\",\n \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
"},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gedit
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
"},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
"},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
"},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"gelemental\n
"},{"location":"applications/gelemental/#path","title":"Path","text":"/usr/bin/gelemental\n
"},{"location":"applications/gelemental/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"gelemental.Gelemental\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gelemental.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"json source file gelemental.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"gelemental\",\n \"icon\": \"gelemental.svg\",\n \"keyword\": \"gelemental\",\n \"launch\": \"gelemental.Gelemental\",\n \"name\": \"gElemental\",\n \"path\": \"/usr/bin/gelemental\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
"},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
"},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application gElemental
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
"},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
"},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
"},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"geogebra\n
"},{"location":"applications/geogebra/#path","title":"Path","text":"/usr/bin/geogebra\n
"},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"\"ggb;ggt\"
\"ggb;ggt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"geogebra-GeoGebra.geogebra-GeoGebra\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file geogebra.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"geogebra\",\n \"icon\": \"geogebra.svg\",\n \"installrecommends\": true,\n \"keyword\": \"geogebra,math\",\n \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n \"name\": \"Geogebra\",\n \"path\": \"/usr/bin/geogebra\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"fileextensions\": \"ggb;ggt\",\n \"legacyfileextensions\": \"ggb;ggt\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktop\": \"geogebra.desktop\"\n}\n
"},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
"},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Geogebra
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
"},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
"},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
"},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.java.gephi
"},{"location":"applications/gephi/#display-name","title":"Display name","text":"\"Gephi\"
"},{"location":"applications/gephi/#path","title":"path","text":"\"/opt/gephi-0.9.1/bin/gephi\"
"},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.gimagereader
"},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"\"OCR-gimagereader\"
"},{"location":"applications/gimagereader/#path","title":"path","text":"\"/usr/bin/gimagereader-gtk\"
"},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"\"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"
"},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"\"bmp;jpeg;png,tiff,tga\"
"},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/gimp/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"gimp gimp-lang\n
"},{"location":"applications/gimp/#path","title":"Path","text":"/usr/bin/gimp\n
"},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
"},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"\"dds\"
\"dds\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"gimp.Gimp\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gimp.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"json source file gimp.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"gimp gimp-lang\",\n \"icon\": \"circle_gimp.svg\",\n \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n \"launch\": \"gimp.Gimp\",\n \"name\": \"Gimp\",\n \"path\": \"/usr/bin/gimp\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n \"fileextensions\": \"dds\",\n \"legacyfileextensions\": \"dds\",\n \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n \"usedefaultapplication\": false,\n \"quick\": true\n}\n
"},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
"},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gimp
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
"},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
"},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
"},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"gnumeric glpk\n
"},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"Gnumerix (alpine)\n
"},{"location":"applications/gnumeric/#path","title":"Path","text":"/usr/bin/gnumeric\n
"},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
"},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"\"gnm\"
\"gnm\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"gnumeric.Gnumeric\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnumeric.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"json source file gnumeric.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gnumeric glpk\",\n \"icon\": \"gnumeric.svg\",\n \"keyword\": \"numeric\",\n \"launch\": \"gnumeric.Gnumeric\",\n \"displayname\": \"Gnumerix (alpine)\",\n \"name\": \"Gnumeric\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnumeric\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n \"fileextensions\": \"gnm\",\n \"legacyfileextensions\": \"gnm\",\n \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
"},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gnumeric
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
"},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
"},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
"},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/golly/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"golly\n
"},{"location":"applications/golly/#path","title":"Path","text":"/usr/games/golly\n
"},{"location":"applications/golly/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"golly.Golly\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file golly.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"golly\",\n \"icon\": \"golly.svg\",\n \"keyword\": \"golly\",\n \"launch\": \"golly.Golly\",\n \"name\": \"Golly\",\n \"path\": \"/usr/games/golly\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
"},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
"},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Golly
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
"},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
"},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
"},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/gretl/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"gretl\n
"},{"location":"applications/gretl/#path","title":"Path","text":"/usr/bin/gretl\n
"},{"location":"applications/gretl/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"gretl_x11.Gretl_x11\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"gretl\",\n \"icon\": \"gretl.svg\",\n \"keyword\": \"gretl\",\n \"launch\": \"gretl_x11.Gretl_x11\",\n \"name\": \"Gretl\",\n \"path\": \"/usr/bin/gretl\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Gretl
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
"},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
"},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/hyper/#path","title":"Path","text":"/opt/Hyper/hyper\n
"},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"x-scheme-handler/ssh\n
"},{"location":"applications/hyper/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"hyper.Hyper\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/hyper.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
"},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"json source file hyper.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n \"RUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n ],\n \"icon\": \"hyper.svg\",\n \"keyword\": \"terminal,remote\",\n \"launch\": \"hyper.Hyper\",\n \"name\": \"hyper\",\n \"path\": \"/opt/Hyper/hyper\",\n \"mimetype\": \"x-scheme-handler/ssh\",\n \"fileextensions\": \"\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
"},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
"},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb https://releases.hyper.is/download/deb && apt-get install --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application hyper
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
"},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
"},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
"},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/impress/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/impress/#arguments","title":"Arguments","text":"\"--impress\"
Impress\n
"},{"location":"applications/impress/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/impress/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
"},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"
\"odp\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-impress\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-impress.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"json source file impress.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_impress.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-impress\",\n \"name\": \"impress\",\n \"displayname\": \"Impress\",\n \"showinview\": \"dock\",\n \"args\": \"--impress\",\n \"uniquerunkey\": \"libreoffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n \"legacyfileextensions\": \"odp\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
"},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application impress
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
"},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
"},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
"},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"inkscape inkscape-lang\n
"},{"location":"applications/inkscape/#path","title":"Path","text":"/usr/bin/inkscape\n
"},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
"},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"\"ai;cdr\"
\"ai;cdr\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"org.inkscape.Inkscape.Inkscape\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.inkscape.Inkscape.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"json source file inkscape.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"debpackage\": \"inkscape inkscape-lang\",\n \"icon\": \"circle_inkscape.svg\",\n \"keyword\": \"inkscape\",\n \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n \"name\": \"inkscape\",\n \"path\": \"/usr/bin/inkscape\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n \"fileextensions\": \"ai;cdr\",\n \"legacyfileextensions\": \"ai;cdr\",\n \"installrecommends\": true,\n \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
"},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
"},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application inkscape
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
"},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
"},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
"},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/jupyter/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.jupyter\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"json source file jupyter.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN add-apt-repository ppa:mozillateam/ppa\",\n \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n \"RUN pip3 install torch\",\n \"RUN pip3 install jupyterlab\",\n \"RUN pip install jupyterlab-nvdashboard\",\n \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n ],\n \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"jupyter.svg\",\n \"keyword\": \"jupyter\",\n \"launch\": \"gnome-terminal-server.jupyter\",\n \"name\": \"jupyter\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n ]\n}\n
"},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
"},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application jupyter
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
"},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
"},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
"},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.nvidia.22.04
"},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"
jupyter nvidia\n
"},{"location":"applications/jupyternvidia/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.jupyternvidia\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"json source file jupyternvidia.d.3.0.json
{\n \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN add-apt-repository ppa:mozillateam/ppa\",\n \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n \"RUN pip3 install torch\",\n \"RUN pip3 install tensorflow-gpu\",\n \"RUN pip3 install jupyter notebook\",\n \"RUN pip3 install jupyterlab\",\n \"RUN pip3 install jupyterlab-nvdashboard\",\n \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n ],\n \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"jupyter.svg\",\n \"keyword\": \"jupyter\",\n \"launch\": \"gnome-terminal-server.jupyternvidia\",\n \"name\": \"jupyternvidia\",\n \"displayname\": \"jupyter nvidia\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\",\n \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n ]\n}\n
"},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
"},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application jupyternvidia
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
"},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
"},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
"},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"kalzium\n
"},{"location":"applications/kalzium/#path","title":"Path","text":"/usr/bin/kalzium\n
"},{"location":"applications/kalzium/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"kalzium.kalzium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kalzium.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"json source file kalzium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kalzium\",\n \"icon\": \"kalzium.svg\",\n \"keyword\": \"kalzium\",\n \"launch\": \"kalzium.kalzium\",\n \"name\": \"Kalzium\",\n \"path\": \"/usr/bin/kalzium\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
"},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Kalzium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
"},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
"},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
"},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"kdiamond\n
"},{"location":"applications/kdiamond/#path","title":"Path","text":"/usr/games/kdiamond\n
"},{"location":"applications/kdiamond/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"kdiamond.kdiamond\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file kdiamond.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"kdiamond\",\n \"icon\": \"kdiamond.svg\",\n \"keyword\": \"kdiamond\",\n \"launch\": \"kdiamond.kdiamond\",\n \"name\": \"kDiamond\",\n \"path\": \"/usr/games/kdiamond\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
"},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kDiamond
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
"},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
"},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
"},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"kgeography\n
"},{"location":"applications/kgeography/#path","title":"Path","text":"/usr/bin/kgeography\n
"},{"location":"applications/kgeography/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"kgeography.kgeography\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kgeography.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"json source file kgeography.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kgeography\",\n \"icon\": \"kgeography.svg\",\n \"keyword\": \"kgeography,geography\",\n \"launch\": \"kgeography.kgeography\",\n \"name\": \"Kgeography\",\n \"path\": \"/usr/bin/kgeography\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
"},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Kgeography
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
"},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
"},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
"},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/kigo/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11 dbus-user-session gnugo kigo\n
"},{"location":"applications/kigo/#displayname","title":"Displayname","text":"kigo\n
"},{"location":"applications/kigo/#path","title":"Path","text":"/usr/games/kigo\n
"},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"application/x-go-sgf;\n
"},{"location":"applications/kigo/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"kigo.kigo\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kigo.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
"},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"json source file kigo.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"args\": \"\",\n \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n \"icon\": \"kigo.svg\",\n \"keyword\": \"go,kigo,gnugo\",\n \"launch\": \"kigo.kigo\",\n \"name\": \"kigo\",\n \"mimetype\": \"application/x-go-sgf;\",\n \"displayname\": \"kigo\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"path\": \"/usr/games/kigo\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n ]\n}\n
"},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
"},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kigo
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
"},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
"},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
"},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/klickety/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"breeze-icon-theme dbus-x11 dbus-user-session klickety\n
"},{"location":"applications/klickety/#path","title":"Path","text":"/usr/games/klickety\n
"},{"location":"applications/klickety/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"klickety.klickety\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file klickety.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n \"icon\": \"klickety.svg\",\n \"keyword\": \"klickety\",\n \"launch\": \"klickety.klickety\",\n \"name\": \"Klickety\",\n \"path\": \"/usr/games/klickety\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
"},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Klickety
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
"},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
"},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
"},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/klotski/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-klotski\n
"},{"location":"applications/klotski/#path","title":"Path","text":"/usr/games/gnome-klotski\n
"},{"location":"applications/klotski/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"gnome-klotski.Gnome-klotski\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-klotski.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"json source file klotski.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-klotski\",\n \"icon\": \"circle_gnome-klotski.svg\",\n \"keyword\": \"gnome klotski,game klotski,klotski\",\n \"launch\": \"gnome-klotski.Gnome-klotski\",\n \"name\": \"klotski\",\n \"host_config\": {\n \"mem_limit\": \"384M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/games/gnome-klotski\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
"},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
"},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application klotski
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
"},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
"},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
"},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/konsole/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"konsole, sudo\n
"},{"location":"applications/konsole/#path","title":"Path","text":"/usr/bin/konsole\n
"},{"location":"applications/konsole/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"konsole.konsole\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"json source file konsole.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"icon\": \"konsole.svg\",\n \"apkpackage\": \"konsole, sudo\",\n \"keyword\": \"ksonsole,console,shell,bash,sh\",\n \"launch\": \"konsole.konsole\",\n \"name\": \"konsole\",\n \"path\": \"/usr/bin/konsole\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"quick\": true\n}\n
"},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
"},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application konsole
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
"},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
"},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
"},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu
"},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11 dbus-user-session ksquares\n
"},{"location":"applications/ksquares/#path","title":"Path","text":"/usr/games/ksquares\n
"},{"location":"applications/ksquares/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"ksquares.ksquares\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file ksquares.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n \"icon\": \"ksquares.svg\",\n \"keyword\": \"ksquares\",\n \"launch\": \"ksquares.ksquares\",\n \"name\": \"kSquares\",\n \"path\": \"/usr/games/ksquares\",\n \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
"},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
"},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kSquares
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
"},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
"},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
"},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"kturtle mesa-dri-gallium\n
"},{"location":"applications/kturtle/#path","title":"Path","text":"/usr/bin/kturtle\n
"},{"location":"applications/kturtle/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"kturtle.kturtle\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.kturtle.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"json source file kturtle.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"kturtle mesa-dri-gallium\",\n \"icon\": \"kturtle.svg\",\n \"keyword\": \"kturtle\",\n \"launch\": \"kturtle.kturtle\",\n \"name\": \"kTurtle\",\n \"path\": \"/usr/bin/kturtle\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
"},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
"},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application kTurtle
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
"},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
"},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
"},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/leocad/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"leocad\n
"},{"location":"applications/leocad/#arguments","title":"Arguments","text":"\"-l /usr/bin/leocad.library.bin\"
/usr/bin/leocad\n
"},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
"},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"\"lcd\"
\"lcd\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"leocad.Leocad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file leocad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"-l /usr/bin/leocad.library.bin\",\n \"cat\": \"games\",\n \"debpackage\": \"leocad\",\n \"icon\": \"leocad.svg\",\n \"keyword\": \"cad,lego\",\n \"launch\": \"leocad.Leocad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"Leocad\",\n \"path\": \"/usr/bin/leocad\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n \"fileextensions\": \"lcd\",\n \"legacyfileextensions\": \"lcd\"\n}\n
"},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
"},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Leocad
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
"},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
"},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
"},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/librecad/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"librecad\n
"},{"location":"applications/librecad/#path","title":"Path","text":"/usr/bin/librecad\n
"},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"image/vnd.dxf;\n
"},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"\"dxf;dwg\"
\"dxf;dwg\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"librecad.Librecad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file librecad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"librecad\",\n \"icon\": \"librecad.svg\",\n \"keyword\": \"librecad,modeling\",\n \"launch\": \"librecad.Librecad\",\n \"name\": \"LibreCAD\",\n \"path\": \"/usr/bin/librecad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"image/vnd.dxf;\",\n \"fileextensions\": \"dxf;dwg\",\n \"legacyfileextensions\": \"dxf;dwg\"\n}\n
"},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
"},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application LibreCAD
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
"},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
"},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
"},{"location":"applications/list/","title":"Application list","text":"This array describe the application list ready to use with abcdesktop.
icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-mahjongg\n
"},{"location":"applications/mahjongg/#path","title":"Path","text":"/usr/games/gnome-mahjongg\n
"},{"location":"applications/mahjongg/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"gnome-mahjongg.Gnome-mahjongg\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-mahjongg.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"json source file mahjongg.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-mahjongg\",\n \"icon\": \"circle_gnome-mahjongg.svg\",\n \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n \"name\": \"mahjongg\",\n \"path\": \"/usr/games/gnome-mahjongg\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
"},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
"},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application mahjongg
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
"},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
"},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
"},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/maps/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"gnome-maps\n
"},{"location":"applications/maps/#path","title":"Path","text":"/usr/bin/gnome-maps\n
"},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
"},{"location":"applications/maps/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"org.gnome.Maps.org.gnome.Maps\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Maps.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"json source file maps.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"apkpackage\": \"gnome-maps\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"icon\": \"org.gnome.Maps.svg\",\n \"keyword\": \"maps\",\n \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n \"name\": \"maps\",\n \"path\": \"/usr/bin/gnome-maps\",\n \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
"},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
"},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application maps
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
"},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
"},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
"},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/math/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/math/#arguments","title":"Arguments","text":"\"--math\"
Math\n
"},{"location":"applications/math/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/math/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
"},{"location":"applications/math/#file-extensions","title":"File extensions","text":"\"odf;odc\"
\"odf;odc\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-math\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-math.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/math/#json-dump","title":"JSON dump","text":"json source file math.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_math.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-math\",\n \"name\": \"math\",\n \"displayname\": \"Math\",\n \"args\": \"--math\",\n \"uniquerunkey\": \"libreoffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n \"fileextensions\": \"odf;odc\",\n \"legacyfileextensions\": \"odf;odc\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
"},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application math
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
"},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f math.d -t math .\n
"},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
"},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"ubuntu
"},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"mathwar\n
"},{"location":"applications/mathwar/#path","title":"Path","text":"/usr/games/mathwar\n
"},{"location":"applications/mathwar/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"mathwar.Mathwar\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file mathwar.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"mathwar\",\n \"icon\": \"mathwar.svg\",\n \"keyword\": \"mathwar,math\",\n \"launch\": \"mathwar.Mathwar\",\n \"name\": \"Mathwar\",\n \"path\": \"/usr/games/mathwar\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
"},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Mathwar
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
"},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
"},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
"},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/minecraft/#path","title":"Path","text":"/usr/bin/minecraft-launcher\n
"},{"location":"applications/minecraft/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"minecraft-launcher.Minecraft Launcher\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/minecraft-launcher.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
"},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"json source file minecraft.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"\",\n \"icon\": \"circle_minecraft.svg\",\n \"keyword\": \"minecraft\",\n \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n \"name\": \"minecraft\",\n \"path\": \"/usr/bin/minecraft-launcher\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktop\": \"minecraft-launcher.desktop\",\n \"host_config\": {\n \"mem_limit\": \"4G\",\n \"shm_size\": \"2G\",\n \"cpu_period\": 200000,\n \"cpu_quota\": 200000,\n \"ipc_mode\": \"shareable\"\n },\n \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n ]\n}\n
"},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
"},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application minecraft
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
"},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
"},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
"},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/mines/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"gnome-mines\n
"},{"location":"applications/mines/#displayname","title":"Displayname","text":"gnome-mines (alpine)\n
"},{"location":"applications/mines/#path","title":"Path","text":"/usr/bin/gnome-mines\n
"},{"location":"applications/mines/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"gnome-mines.Gnome-mines\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Mines.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"json source file mines.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"displayname\": \"gnome-mines (alpine)\",\n \"apkpackage\": \"gnome-mines\",\n \"icon\": \"circle_gnome-mines.svg\",\n \"keyword\": \"gnome mines,game mines,mines\",\n \"launch\": \"gnome-mines.Gnome-mines\",\n \"name\": \"Mines\",\n \"path\": \"/usr/bin/gnome-mines\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
"},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
"},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Mines
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
"},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
"},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
"},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
"},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"FileManager\n
"},{"location":"applications/nautilus/#path","title":"Path","text":"/usr/bin/nautilus\n
"},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/nautilus/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"org.gnome.Nautilus.Org.gnome.Nautilus\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Nautilus.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
"},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"json source file nautilus.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"preruncommands\": [\n \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n \"COPY composer/node /composer/node\",\n \"RUN cd /composer/node/ocdownload && npm install\",\n \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n ],\n \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n \"icon\": \"circle_filemanager.svg\",\n \"keyword\": \"file,manager,nautilus\",\n \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n \"name\": \"nautilus\",\n \"displayname\": \"FileManager\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/nautilus\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n \"usedefaultapplication\": true,\n \"quick\": true\n}\n
"},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
"},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application nautilus
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
"},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
"},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
"},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk
"},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"netbeans
"},{"location":"applications/netbeans/#display-name","title":"Display name","text":"\"Netbeans\"
"},{"location":"applications/netbeans/#path","title":"path","text":"\"/usr/bin/netbeans\"
"},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"Notepad Wine (alpine)\n
"},{"location":"applications/notepad-wine/#path","title":"Path","text":"/usr/bin/notepad\n
"},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"application/text;\n
"},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"\"txt;log;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"notepad.exe.notepad.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"json source file notepad-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"apkpackage\": \"wine\",\n \"icon\": \"notepad.svg\",\n \"keyword\": \"wine,notepad,text\",\n \"launch\": \"notepad.exe.notepad.exe\",\n \"name\": \"notepad-wine\",\n \"displayname\": \"Notepad Wine (alpine)\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\": \"txt;log;\",\n \"path\": \"/usr/bin/notepad\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
"},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application notepad-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
"},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
"},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
"},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"notepadqq\n
"},{"location":"applications/notepadqq/#path","title":"Path","text":"/usr/bin/notepadqq\n
"},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
"},{"location":"applications/notepadqq/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"notepadqq-bin.Notepadqq\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/notepadqq.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"json source file notepadqq.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,development\",\n \"debpackage\": \"notepadqq\",\n \"icon\": \"notepadqq.svg\",\n \"keyword\": \"notepad,plus,editor\",\n \"launch\": \"notepadqq-bin.Notepadqq\",\n \"name\": \"notepadqq\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n \"host_config\": {\n \"mem_limit\": \"512M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n },\n \"path\": \"/usr/bin/notepadqq\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
"},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
"},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application notepadqq
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
"},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
"},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
"},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/octave/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"octave\n
"},{"location":"applications/octave/#path","title":"Path","text":"/usr/bin/octave\n
"},{"location":"applications/octave/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"octave-gui.octave-gui\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/www.octave.org-octave.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"json source file octave.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"octave\",\n \"icon\": \"Gnu-octave-logo.svg\",\n \"keyword\": \"octave\",\n \"launch\": \"octave-gui.octave-gui\",\n \"name\": \"octave\",\n \"path\": \"/usr/bin/octave\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
"},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
"},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application octave
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
"},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
"},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
"},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"onlyoffice-desktopeditors\n
"},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"OnlyOffice\n
"},{"location":"applications/onlyoffice/#path","title":"Path","text":"/usr/bin/desktopeditors\n
"},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
"},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"DesktopEditors.DesktopEditors\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/onlyoffice-desktopeditors.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"json source file onlyoffice.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"onlyoffice-desktopeditors\",\n \"icon\": \"onlyoffice-desktopeditors.svg\",\n \"installrecommends\": true,\n \"keyword\": \"office,onlyoffice,desktop,editor\",\n \"launch\": \"DesktopEditors.DesktopEditors\",\n \"name\": \"onlyoffice\",\n \"displayname\": \"OnlyOffice\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/desktopeditors\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n \"args\": \"\",\n \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n \"licence\": \"non-free\"\n}\n
"},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
"},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application onlyoffice
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
"},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
"},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
"},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/openshift/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"rhc gnome-terminal\n
"},{"location":"applications/openshift/#arguments","title":"Arguments","text":"\"--disable-factory --class openshift.cli\"
OpenShift cli\n
"},{"location":"applications/openshift/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/openshift/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.openshift.cli\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
"},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n ],\n \"debpackage\": \"rhc gnome-terminal\",\n \"icon\": \"openshift.svg\",\n \"keyword\": \"oc,openshift\",\n \"launch\": \"gnome-terminal-server.openshift.cli\",\n \"name\": \"openshift\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"displayname\": \"OpenShift cli\",\n \"args\": \"--disable-factory --class openshift.cli\",\n \"quick\": true\n}\n
"},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application openshift
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
"},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
"},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/pinta/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
"},{"location":"applications/pinta/#displayname","title":"Displayname","text":"Pinta (alpine)\n
"},{"location":"applications/pinta/#path","title":"Path","text":"/usr/bin/pinta\n
"},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
"},{"location":"applications/pinta/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"Pinta.Pinta\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/pinta.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"json source file pinta.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"displayname\": \"Pinta (alpine)\",\n \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n \"icon\": \"pinta.svg\",\n \"keyword\": \"pinta,paint\",\n \"launch\": \"Pinta.Pinta\",\n \"name\": \"Pinta\",\n \"path\": \"/usr/bin/pinta\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
"},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
"},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Pinta
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
"},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
"},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
"},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/planner/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"planner\n
"},{"location":"applications/planner/#path","title":"Path","text":"/usr/bin/planner\n
"},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"application/x-planner;\n
"},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"\"mpp;mpx\"
\"mpp;mpx\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"planner.Planner\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file planner.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"planner\",\n \"icon\": \"planner.svg\",\n \"launch\": \"planner.Planner\",\n \"name\": \"Planner\",\n \"path\": \"/usr/bin/planner\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"application/x-planner;\",\n \"fileextensions\": \"mpp;mpx\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"legacyfileextensions\": \"mpp;mpx\"\n}\n
"},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
"},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Planner
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
"},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
"},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
"},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/postman/#displayname","title":"Displayname","text":"Postman\n
"},{"location":"applications/postman/#path","title":"Path","text":"/usr/local/bin/Postman/app/Postman\n
"},{"location":"applications/postman/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"postman.Postman\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
"},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"json source file postman.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n ],\n \"cat\": \"development\",\n \"debpackage\": \"\",\n \"installrecommends\": false,\n \"icon\": \"circle_postman.svg\",\n \"keyword\": \"http,post,json\",\n \"launch\": \"postman.Postman\",\n \"displayname\": \"Postman\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"postman\",\n \"path\": \"/usr/local/bin/Postman/app/Postman\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
"},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
"},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2 libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application postman
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
"},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
"},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
"},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/powershell/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
"},{"location":"applications/powershell/#arguments","title":"Arguments","text":"\"--class=powershell -- /usr/bin/pwsh\"
Powershell\n
"},{"location":"applications/powershell/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"application/hlp;\n
"},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"\"hlp;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.powershell\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file powershell.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n \"icon\": \"powershell.svg\",\n \"keyword\": \"powershell\",\n \"launch\": \"gnome-terminal-server.powershell\",\n \"name\": \"powershell\",\n \"displayname\": \"Powershell\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"application/hlp;\",\n \"fileextensions\": \"hlp;\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
"},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application powershell
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
"},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
"},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
"},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"putty\n
"},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"Putty Unix\n
"},{"location":"applications/putty-unix/#path","title":"Path","text":"/usr/bin/putty\n
"},{"location":"applications/putty-unix/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"putty.Putty\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file putty-unix.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"\",\n \"cat\": \"utilities\",\n \"apkpackage\": \"putty\",\n \"icon\": \"circle_putty-unix.svg\",\n \"keyword\": \"putty,ssh,terminal\",\n \"launch\": \"putty.Putty\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"putty-unix\",\n \"displayname\": \"Putty Unix\",\n \"path\": \"/usr/bin/putty\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
"},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application putty-unix
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
"},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
"},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
"},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"\"/composer/bin/putty.exe\"
Putty Wine (alpine)\n
"},{"location":"applications/putty-wine/#path","title":"Path","text":"/usr/bin/wine64\n
"},{"location":"applications/putty-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"putty.exe.putty.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
"},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"json source file putty-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"RUN mkdir -p /composer/bin\",\n \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n ],\n \"args\": \"/composer/bin/putty.exe\",\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"putty.svg\",\n \"keyword\": \"wine,putty,ssh,terminal\",\n \"launch\": \"putty.exe.putty.exe\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"putty-wine\",\n \"displayname\": \"Putty Wine (alpine)\",\n \"path\": \"/usr/bin/wine64\"\n}\n
"},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
"},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application putty-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
"},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
"},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
"},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"ubuntu
"},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"qelectrotech\n
"},{"location":"applications/qelectrotech/#path","title":"Path","text":"/usr/bin/qelectrotech\n
"},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"qelectrotech.Qelectrotech\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file qelectrotech.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"debpackage\": \"qelectrotech\",\n \"icon\": \"qelectrotech.svg\",\n \"keyword\": \"qelectrotech\",\n \"launch\": \"qelectrotech.Qelectrotech\",\n \"name\": \"qElectrotech\",\n \"path\": \"/usr/bin/qelectrotech\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
"},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application qElectrotech
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
"},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
"},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
"},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"Remarkable\n
"},{"location":"applications/remarkable/#path","title":"Path","text":"/usr/bin/remarkable\n
"},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"text/x-markdown;text/markdown;\n
"},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"\"md;markdown\"
\"md;markdown\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"remarkable.Remarkable\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remarkable.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"json source file remarkable.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"remarkable.svg\",\n \"keyword\": \"markdown,editor\",\n \"launch\": \"remarkable.Remarkable\",\n \"name\": \"remarkable\",\n \"displayname\": \"Remarkable\",\n \"path\": \"/usr/bin/remarkable\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/x-markdown;text/markdown;\",\n \"legacyfileextensions\": \"md;markdown\",\n \"fileextensions\": \"md;markdown\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
"},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remarkable
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
"},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
"},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
"},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/remmina/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
"},{"location":"applications/remmina/#displayname","title":"Displayname","text":"Remmina\n
"},{"location":"applications/remmina/#path","title":"Path","text":"/usr/bin/remmina\n
"},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"application/x-remmina;\n
"},{"location":"applications/remmina/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"remmina.Remmina\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remmina-file.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"json source file remmina.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n \"icon\": \"remmina.svg\",\n \"keyword\": \"rdp,tsclient\",\n \"launch\": \"remmina.Remmina\",\n \"name\": \"remmina\",\n \"displayname\": \"Remmina\",\n \"args\": \"\",\n \"path\": \"/usr/bin/remmina\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"application/x-remmina;\",\n \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
"},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remmina
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
"},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
"},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
"},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
"},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"RemoteDesktop\n
"},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"/bin/remotedesktopmanager.free\n
"},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"RemoteDesktopManager.Free.RemoteDesktopManager.Free\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/remotedesktopmanager.free.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
"},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"json source file remotedesktopmanager.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"licence\": \"non-free\",\n \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n \"icon\": \"circle-remotedesktopmanager.svg\",\n \"keyword\": \"remote,desktop,ssh\",\n \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n \"name\": \"remotedesktopmanager\",\n \"displayname\": \"RemoteDesktop\",\n \"path\": \"/bin/remotedesktopmanager.free\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"\",\n \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n ]\n}\n
"},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
"},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application remotedesktopmanager
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
"},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
"},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
"},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"rhythmbox\n
"},{"location":"applications/rhythmbox/#path","title":"Path","text":"/usr/bin/rhythmbox\n
"},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
"},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"rhythmbox.Rhythmbox\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Rhythmbox3.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"json source file rhythmbox.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"rhythmbox\",\n \"icon\": \"circle_rhythmbox.svg\",\n \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n \"launch\": \"rhythmbox.Rhythmbox\",\n \"name\": \"rhythmbox\",\n \"path\": \"/usr/bin/rhythmbox\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
"},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
"},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application rhythmbox
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
"},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
"},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
"},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/robots/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-robots\n
"},{"location":"applications/robots/#path","title":"Path","text":"/usr/games/gnome-robots\n
"},{"location":"applications/robots/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"gnome-robots.Gnome-robots\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
gnome-robots.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"json source file robots.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-robots\",\n \"icon\": \"circle_gnome-robots.svg\",\n \"keyword\": \"gnome robots,game robots,robots\",\n \"launch\": \"gnome-robots.Gnome-robots\",\n \"name\": \"Robots\",\n \"path\": \"/usr/games/gnome-robots\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"gnome-robots.desktop\"\n}\n
"},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
"},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Robots
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
"},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
"},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
"},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"shotcut mesa-dri-gallium\n
"},{"location":"applications/shotcut/#path","title":"Path","text":"/usr/bin/shotcut\n
"},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
"},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"\"mlt\"
\"mlt\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"shotcut.Shotcut\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.shotcut.Shotcut.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"json source file shotcut.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"graphics\",\n \"apkpackage\": \"shotcut mesa-dri-gallium\",\n \"icon\": \"circle_shotcut.svg\",\n \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n \"launch\": \"shotcut.Shotcut\",\n \"name\": \"Shotcut\",\n \"path\": \"/usr/bin/shotcut\",\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n \"fileextensions\": \"mlt\",\n \"legacyfileextensions\": \"mlt\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
"},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Shotcut
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
"},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
"},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
"},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"stellarium\n
"},{"location":"applications/stellarium/#path","title":"Path","text":"/usr/bin/stellarium\n
"},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"application/x-stellarium-script;\n
"},{"location":"applications/stellarium/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"stellarium.stellarium\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.stellarium.Stellarium.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"json source file stellarium.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"stellarium\",\n \"icon\": \"stellarium.svg\",\n \"keyword\": \"stellarium,astronomy\",\n \"launch\": \"stellarium.stellarium\",\n \"name\": \"Stellarium\",\n \"path\": \"/usr/bin/stellarium\",\n \"mimetype\": \"application/x-stellarium-script;\",\n \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
"},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Stellarium
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
"},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
"},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
"},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/step/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"step\n
"},{"location":"applications/step/#path","title":"Path","text":"/usr/bin/step\n
"},{"location":"applications/step/#mimetype","title":"Mimetype","text":"application/x-step;\n
"},{"location":"applications/step/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"step.step\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.kde.step.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/step/#json-dump","title":"JSON dump","text":"json source file step.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"education\",\n \"apkpackage\": \"step\",\n \"icon\": \"step.svg\",\n \"keyword\": \"step\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"launch\": \"step.step\",\n \"name\": \"Step\",\n \"path\": \"/usr/bin/step\",\n \"mimetype\": \"application/x-step;\",\n \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
"},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Step
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
"},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
"},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
"},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/stress/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"at-spi2-core gnome-terminal dbus-x11 stress\n
"},{"location":"applications/stress/#arguments","title":"Arguments","text":"\"--disable-factory --class=stress\"
/usr/bin/gnome-terminal\n
"},{"location":"applications/stress/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.stress\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/gnome-terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"json source file stress.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n \"icon\": \"stress.svg\",\n \"keyword\": \"stress,cpu,shell\",\n \"launch\": \"gnome-terminal-server.stress\",\n \"name\": \"stress\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=stress\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
"},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
"},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application stress
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
"},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
"},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
"},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"sublime-text\n
"},{"location":"applications/sublime-text/#path","title":"Path","text":"/opt/sublime_text/sublime_text\n
"},{"location":"applications/sublime-text/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"sublime_text.Sublime_text\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/sublime_text.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
"},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"json source file sublime-text.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"preruncommands\": [\n \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n ],\n \"debpackage\": \"sublime-text\",\n \"installrecommends\": true,\n \"icon\": \"circle_sublime-text.svg\",\n \"keyword\": \"ide,code,sublime-text\",\n \"launch\": \"sublime_text.Sublime_text\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"sublime-Text\",\n \"path\": \"/opt/sublime_text/sublime_text\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
"},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
"},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application sublime-Text
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
"},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
"},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
"},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"gnome-sudoku\n
"},{"location":"applications/sudoku/#path","title":"Path","text":"/usr/bin/gnome-sudoku\n
"},{"location":"applications/sudoku/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"org.gnome.Sudoku.org.gnome.Sudoku\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Sudoku.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"json source file sudoku.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnome-sudoku\",\n \"icon\": \"org.gnome.Sudoku.svg\",\n \"keyword\": \"sudoku\",\n \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n \"name\": \"sudoku\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-sudoku\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
"},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
"},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application sudoku
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
"},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
"},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
"},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpinei.minimal
"},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"alpine
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"supertux mesa-gl mesa-egl mesa-dri-gallium\n
"},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"supertux2\n
"},{"location":"applications/supertux2/#path","title":"Path","text":"/usr/games/supertux2\n
"},{"location":"applications/supertux2/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"supertux2.supertux2\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/supertux2.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"json source file supertux2.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n \"icon\": \"circle_supertux.svg\",\n \"keyword\": \"supertux\",\n \"launch\": \"supertux2.supertux2\",\n \"name\": \"supertux2\",\n \"displayname\": \"supertux2\",\n \"path\": \"/usr/games/supertux2\",\n \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
"},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
"},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application supertux2
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
"},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
"},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
"},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"swell-foop\n
"},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"swell-foop\n
"},{"location":"applications/swell-foop/#path","title":"Path","text":"/usr/games/swell-foop\n
"},{"location":"applications/swell-foop/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"swell-foop.Swell-foop\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.SwellFoop.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"json source file swell-foop.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"swell-foop\",\n \"icon\": \"circle_swell-foop.svg\",\n \"keyword\": \"swell,foop\",\n \"launch\": \"swell-foop.Swell-foop\",\n \"name\": \"swell-foop\",\n \"displayname\": \"swell-foop\",\n \"path\": \"/usr/games/swell-foop\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
"},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
"},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application swell-foop
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
"},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
"},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
"},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/taquin/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"gnome-taquin\n
"},{"location":"applications/taquin/#path","title":"Path","text":"/usr/bin/gnome-taquin\n
"},{"location":"applications/taquin/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"org.gnome.Taquin.org.gnome.Weather\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Taquin.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"json source file taquin.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"gnome-taquin\",\n \"icon\": \"org.gnome.Taquin.svg\",\n \"keyword\": \"taquin\",\n \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n \"name\": \"taquin\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-taquin\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
"},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
"},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application taquin
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
"},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
"},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
"},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/teams/#arguments","title":"Arguments","text":"\"--disable-namespace-sandbox --disable-setuid-sandbox\"
Microsoft Teams\n
"},{"location":"applications/teams/#path","title":"Path","text":"/usr/bin/teams\n
"},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"x-scheme-handler/msteams;\n
"},{"location":"applications/teams/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"microsoft teams - preview.Microsoft Teams - Preview\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/teams.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"json source file teams.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"\",\n \"preruncommands\": [\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ],\n \"icon\": \"teams.svg\",\n \"keyword\": \"teams\",\n \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n \"name\": \"teams\",\n \"displayname\": \"Microsoft Teams\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/teams\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"x-scheme-handler/msteams;\",\n \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
"},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application teams
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
"},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
"},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
"},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/terminal/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/terminal/#arguments","title":"Arguments","text":"\"--disable-factory\"
Terminal sudo\n
"},{"location":"applications/terminal/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminal/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/terminal/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.Gnome-terminal\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"json source file terminal.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n \"name\": \"Terminal\",\n \"displayname\": \"Terminal sudo\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"args\": \"--disable-factory\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n \"abcdesktop_release\": 3,\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n \"RUN mkdir -p /run/user\",\n \"RUN chmod 777 /run/user\"\n ]\n}\n
"},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
"},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Terminal
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
"},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
"},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
"},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.gtk.fulldev.ia
"},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"gnome-terminal dbus-x11
"},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"\"--disable-factory --class=terminalai\"
"},{"location":"applications/terminalai/#display-name","title":"Display name","text":"\"Shell AI\"
"},{"location":"applications/terminalai/#path","title":"path","text":"\"/usr/bin/gnome-terminal\"
"},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
"},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"\"--disable-factory --class=ephemeral\"
Terminal [ephemeral container]\n
"},{"location":"applications/terminalephemeral/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.ephemeral\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"json source file terminalephemeral.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"ephemeral,terminal,shell\",\n \"launch\": \"gnome-terminal-server.ephemeral\",\n \"name\": \"terminalephemeral\",\n \"displayname\": \"Terminal [ephemeral container]\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=ephemeral\",\n \"containerengine\": \"ephemeral_container\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
"},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application terminalephemeral
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
"},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
"},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
"},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
"},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"\"--disable-factory --class=pod\"
Terminal [Pod]\n
"},{"location":"applications/terminalpod/#path","title":"Path","text":"/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalpod/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"gnome-terminal-server.pod\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Terminal.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"json source file terminalpod.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n \"icon\": \"pantheon-terminal-icons.svg\",\n \"keyword\": \"pod,terminal,shell\",\n \"launch\": \"gnome-terminal-server.pod\",\n \"name\": \"terminalpod\",\n \"displayname\": \"Terminal [Pod]\",\n \"path\": \"/usr/bin/gnome-terminal\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"256M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false,\n \"ipc_mode\": false\n },\n \"args\": \"--disable-factory --class=pod\",\n \"containerengine\": \"pod_application\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
"},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application terminalpod
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
"},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
"},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
"},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all
"},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"gnome-tetravex\n
"},{"location":"applications/tetravex/#path","title":"Path","text":"/usr/games/gnome-tetravex\n
"},{"location":"applications/tetravex/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"gnome-tetravex.Gnome-tetravex\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file tetravex.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"debpackage\": \"gnome-tetravex\",\n \"icon\": \"gnome-tetravex.svg\",\n \"keyword\": \"game\",\n \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n \"name\": \"Tetravex\",\n \"path\": \"/usr/games/gnome-tetravex\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n \"desktop\": \"gnome-tetravex.desktop\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"mem_limit\": \"384M\",\n \"shm_size\": \"128M\",\n \"pid_mode\": false\n }\n}\n
"},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
"},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application Tetravex
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
"},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
"},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
"},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"tk thunderbird gnome-keyring\n
"},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"Thunderbird\n
"},{"location":"applications/thunderbird/#path","title":"Path","text":"/usr/bin/thunderbird\n
"},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"x-scheme-handler/mailto\n
"},{"location":"applications/thunderbird/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"Mail.Thunderbird\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/thunderbird.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"json source file thunderbird.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"debpackage\": \"tk thunderbird gnome-keyring\",\n \"icon\": \"thunderbird.svg\",\n \"keyword\": \"mail\",\n \"launch\": \"Mail.Thunderbird\",\n \"name\": \"thunderbird\",\n \"displayname\": \"Thunderbird\",\n \"path\": \"/usr/bin/thunderbird\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"x-scheme-handler/mailto\",\n \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
"},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
"},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application thunderbird
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
"},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
"},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
"},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.18.04
"},{"location":"applications/vice/#displayname","title":"Displayname","text":"Commodore64\n
"},{"location":"applications/vice/#path","title":"Path","text":"/usr/bin/x64\n
"},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"\"crt;bin\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"x64.X64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/x64.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
"},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"json source file vice.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"c64.svg\",\n \"keyword\": \"x64,vice,commodore,c64\",\n \"launch\": \"x64.X64\",\n \"name\": \"vice\",\n \"displayname\": \"Commodore64\",\n \"installrecommends\": true,\n \"path\": \"/usr/bin/x64\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n \"fileextensions\": \"crt;bin\",\n \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n \"usedefaultapplication\": false\n}\n
"},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
"},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vice
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
"},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
"},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
"},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/vlc/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
"},{"location":"applications/vlc/#displayname","title":"Displayname","text":"videolan\n
"},{"location":"applications/vlc/#path","title":"Path","text":"/usr/bin/vlc\n
"},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
"},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"vlc.vlc\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/vlc.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"json source file vlc.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office,graphics\",\n \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n \"icon\": \"circle_vlc.svg\",\n \"keyword\": \"vlc, videolan, video, lan, dvd\",\n \"launch\": \"vlc.vlc\",\n \"name\": \"vlc\",\n \"displayname\": \"videolan\",\n \"path\": \"/usr/bin/vlc\",\n \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n \"quick\": true\n}\n
"},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
"},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vlc
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
"},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
"},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
"},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"abcdesktop/docker-osx
"},{"location":"applications/vmmacos/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"qemu.Qemu-system-x86_64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
RUN yes | sudo pacman -S xorg-xauth\n
"},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"json source file vmmacos.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"RUN yes | sudo pacman -S xorg-xauth\"\n ],\n \"icon\": \"MacOS_logo.svg\",\n \"keyword\": \"macos,apple\",\n \"launch\": \"qemu.Qemu-system-x86_64\",\n \"name\": \"vmmacos\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"devices\": [\n \"/dev/kvm\"\n ],\n \"mem_limit\": \"16G\"\n },\n \"template\": \"abcdesktop/docker-osx\",\n \"workdir\": \"/home/arch/OSX-KVM\",\n \"user\": \"arch\",\n \"home\": \"/home/arch\",\n \"cmd\": [\n \"/bin/bash\",\n \"-c\",\n \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true ; [[ \\\"${NOPICKER}\\\" == true ]] && { sed -i '/^.*InstallMedia.*/d' Launch.sh && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\" ; } || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && { ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --count 1 --tsv ./serial.tsv --bootdisks --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\" --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" --output-env \\\"${ENV:=/env}\\\" || exit 1 ; } ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && { source \\\"${ENV:=/env}\\\" 2>/dev/null ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\" --serial \\\"${SERIAL}\\\" --board-serial \\\"${BOARD_SERIAL}\\\" --uuid \\\"${UUID}\\\" --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\" --height \\\"${HEIGHT:-1080}\\\" --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ; ./Launch.sh\"\n ]\n}\n
"},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
"},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true ; [[ \"${NOPICKER}\" == true ]] && { sed -i '/^.*InstallMedia.*/d' Launch.sh && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\" ; } || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" ; [[ \"${GENERATE_UNIQUE}\" == true ]] && { ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --count 1 --tsv ./serial.tsv --bootdisks --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\" --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" --output-env \"${ENV:=/env}\" || exit 1 ; } ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && { source \"${ENV:=/env}\" 2>/dev/null ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\" --serial \"${SERIAL}\" --board-serial \"${BOARD_SERIAL}\" --uuid \"${UUID}\" --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\" --height \"${HEIGHT:-1080}\" --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ; ./Launch.sh\" ]\n\n
"},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmmacos
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
"},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
"},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
"},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/vmrc/#licence","title":"Licence","text":"** This application is NO FREE. ** You need to build it manually.
"},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"VMRC\n
"},{"location":"applications/vmrc/#path","title":"Path","text":"/usr/bin/vmrc\n
"},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"x-scheme-handler/vmrc;\n
"},{"location":"applications/vmrc/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"vmrc.Vmrc\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/vmware-vmrc.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
"},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"json source file vmrc.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"licence\": \"non-free\",\n \"debpackage\": \"\",\n \"icon\": \"circle_vmware.svg\",\n \"keyword\": \"vmrc,vmware,remote,console\",\n \"launch\": \"vmrc.Vmrc\",\n \"name\": \"vmrc\",\n \"displayname\": \"VMRC\",\n \"path\": \"/usr/bin/vmrc\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"mimetype\": \"x-scheme-handler/vmrc;\",\n \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n \"preruncommands\": [\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\",\n \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n ]\n}\n
"},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
"},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmrc
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
"},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
"},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
"},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.vm.ubuntu:22.04
"},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"qemu.Qemu-system-x86_64\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file vmubuntu.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"icon\": \"vm-linux-ubuntu.svg\",\n \"keyword\": \"vm,ubuntu,jammy\",\n \"launch\": \"qemu.Qemu-system-x86_64\",\n \"name\": \"vmubuntu\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"host_config\": {\n \"devices\": [\n \"/dev/kvm\"\n ],\n \"mem_limit\": \"16G\"\n },\n \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n \"home\": \"/home/balloon\",\n \"cmd\": \"/docker-entrypoint.sh\"\n}\n
"},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
"},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application vmubuntu
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
"},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
"},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
"},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/vscode/#arguments","title":"Arguments","text":"\"--extensions-dir /usr/share/code/extensions --verbose\"
/usr/bin/code\n
"},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
"},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"
\"c;cpp;py;json;java;md;yml;yaml;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"code.Code\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/code.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
"},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"json source file vscode.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"\",\n \"icon\": \"circle_visual-studio-code.svg\",\n \"keyword\": \"ide,vscode,visual studio code,code\",\n \"launch\": \"code.Code\",\n \"name\": \"VSCode\",\n \"path\": \"/usr/bin/code\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"desktop\": \"code.desktop\",\n \"host_config\": {\n \"mem_limit\": \"2G\",\n \"shm_size\": \"2G\",\n \"cpu_period\": 200000,\n \"cpu_quota\": 200000,\n \"cap_add\": [\n \"SYS_ADMIN\"\n ]\n },\n \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n \"desktopfile\": \"/usr/share/applications/code.desktop\",\n \"preruncommands\": [\n \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n ],\n \"quick\": true\n}\n
"},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
"},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application VSCode
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
"},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
"},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
"},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/weather/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"gnome-weather\n
"},{"location":"applications/weather/#path","title":"Path","text":"/usr/bin/gnome-weather\n
"},{"location":"applications/weather/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"org.gnome.Weather.org.gnome.Weather\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.gnome.Weather.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"json source file weather.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"gnome-weather\",\n \"icon\": \"org.gnome.Weather.svg\",\n \"keyword\": \"weather\",\n \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n \"name\": \"weather\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/gnome-weather\",\n \"args\": \"\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
"},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
"},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application weather
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
"},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
"},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
"},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"dbus-x11\n
"},{"location":"applications/whatsdesk/#path","title":"Path","text":"/opt/whatsdesk/whatsdesk\n
"},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"x-scheme-handler/whatsapp;\n
"},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"whatsdesk.whatsdesk\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/whatsdesk.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"json source file whatsdesk.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities,office\",\n \"debpackage\": \"dbus-x11\",\n \"icon\": \"whatsapp.svg\",\n \"keyword\": \"whatsapp,whatsdesk\",\n \"launch\": \"whatsdesk.whatsdesk\",\n \"name\": \"whatsdesk\",\n \"path\": \"/opt/whatsdesk/whatsdesk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n \"mimetype\": \"x-scheme-handler/whatsapp;\",\n \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n \"preruncommands\": [\n \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n ]\n}\n
"},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
"},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application whatsdesk
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
"},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
"},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
"},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"Winefile Wine (alpine)\n
"},{"location":"applications/winefile-wine/#path","title":"Path","text":"/usr/bin/winefile\n
"},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"winefile.exe.winefile.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"json source file winefile-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n ],\n \"cat\": \"utilities\",\n \"apkpackage\": \"wine\",\n \"icon\": \"winefile.svg\",\n \"keyword\": \"wine,winfile,winefile,file,manager\",\n \"launch\": \"winefile.exe.winefile.exe\",\n \"name\": \"winefile-wine\",\n \"displayname\": \"Winefile Wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/winefile\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
"},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winefile-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
"},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
"},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
"},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.wine
"},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"wine\n
"},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"WineMine Wine (alpine)\n
"},{"location":"applications/winemine-wine/#path","title":"Path","text":"/usr/bin/winemine\n
"},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"winemine.exe.winemine.exe\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
"},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"json source file winemine-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"games\",\n \"apkpackage\": \"wine\",\n \"preruncommands\": [\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n ],\n \"icon\": \"winemine.svg\",\n \"keyword\": \"wine,winemine,mine\",\n \"launch\": \"winemine.exe.winemine.exe\",\n \"name\": \"winemine-wine\",\n \"displayname\": \"WineMine Wine (alpine)\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"path\": \"/usr/bin/winemine\",\n \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
"},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winemine-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
"},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
"},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
"},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.wine
"},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"\"winhelp\"
Winhelp Wine\n
"},{"location":"applications/winhelp-wine/#path","title":"Path","text":"/usr/bin/wine\n
"},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"application/hlp;\n
"},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"\"hlp;\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"winhlp32.exe.Wine\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"json source file winhelp-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"args\": \"winhelp\",\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n ],\n \"debpackage\": \"\",\n \"icon\": \"winhelp.svg\",\n \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n \"launch\": \"winhlp32.exe.Wine\",\n \"name\": \"winhelp-wine\",\n \"displayname\": \"Winhelp Wine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"mimetype\": \"application/hlp;\",\n \"fileextensions\": \"hlp;\",\n \"path\": \"/usr/bin/wine\",\n \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
"},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
"},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winhelp-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
"},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
"},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
"},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.wine
"},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"\"/composer/bin/winscp.exe\"
WinSCP\n
"},{"location":"applications/winscp-wine/#path","title":"Path","text":"/usr/bin/wine\n
"},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"winscp.exe.Wine\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
PRE run command are run before the package install command
ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"json source file winscp-wine.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"template\": \"abcdesktopio/oc.template.wine\",\n \"preruncommands\": [\n \"ENV WINEARCH=win64\",\n \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n \"USER $BUSER\",\n \"RUN wineboot --init\",\n \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n ],\n \"args\": \"/composer/bin/winscp.exe\",\n \"cat\": \"utilities\",\n \"debpackage\": \"\",\n \"icon\": \"winscp.svg\",\n \"keyword\": \"wine,scp,sftp\",\n \"launch\": \"winscp.exe.Wine\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"name\": \"winscp-wine\",\n \"displayname\": \"WinSCP\",\n \"path\": \"/usr/bin/wine\"\n}\n
"},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
"},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application winscp-wine
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
"},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
"},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
"},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.gtk
"},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"wireshark\n
"},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"wireshark (alpine)\n
"},{"location":"applications/wireshark/#path","title":"Path","text":"/usr/bin/wireshark\n
"},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
"},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"\"cap,pcap\"
\"cap\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"wireshark.Wireshark\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/org.wireshark.Wireshark.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
ENV QT_XCB_NO_MITSHM=1\n
"},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"json source file wireshark.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"preruncommands\": [\n \"ENV QT_XCB_NO_MITSHM=1\"\n ],\n \"apkpackage\": \"wireshark\",\n \"icon\": \"wireshark.svg\",\n \"keyword\": \"capture,network,analyzer\",\n \"launch\": \"wireshark.Wireshark\",\n \"name\": \"wireshark\",\n \"displayname\": \"wireshark (alpine)\",\n \"path\": \"/usr/bin/wireshark\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n \"fileextensions\": \"cap,pcap\",\n \"legacyfileextensions\": \"cap\"\n}\n
"},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
"},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application wireshark
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
"},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
"},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
"},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.libreoffice
"},{"location":"applications/writer/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"libreoffice-gnome\n
"},{"location":"applications/writer/#arguments","title":"Arguments","text":"\"--writer\"
Writer alpine\n
"},{"location":"applications/writer/#path","title":"Path","text":"/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"\"libreoffice\"
"},{"location":"applications/writer/#showinview","title":"Showinview","text":"\"dock\"
"},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
"},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"
\"odf;ott;fodt;uot\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"libreoffice.libreoffice-writer\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/libreoffice-writer.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"json source file writer.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"office\",\n \"apkpackage\": \"libreoffice-gnome\",\n \"icon\": \"circle_libreoffice_writer.svg\",\n \"keyword\": \"libreoffice,office\",\n \"launch\": \"libreoffice.libreoffice-writer\",\n \"name\": \"writer\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"displayname\": \"Writer alpine\",\n \"showinview\": \"dock\",\n \"path\": \"/usr/lib/libreoffice/program/soffice\",\n \"args\": \"--writer\",\n \"uniquerunkey\": \"libreoffice\",\n \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n \"usedefaultapplication\": true,\n \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
"},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application writer
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
"},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
"},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
"},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/xclock/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"xclock\n
"},{"location":"applications/xclock/#displayname","title":"Displayname","text":"Xclock\n
"},{"location":"applications/xclock/#path","title":"Path","text":"/usr/bin/xclock\n
"},{"location":"applications/xclock/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"xclock.XClock\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xclock.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"apkpackage\": \"xclock\",\n \"icon\": \"xclock.svg\",\n \"keyword\": \"clock,xclock,time\",\n \"launch\": \"xclock.XClock\",\n \"name\": \"xclock\",\n \"displayname\": \"Xclock\",\n \"path\": \"/usr/bin/xclock\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n \"args\": \"\",\n \"quick\": true\n}\n
"},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
"},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xclock
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
"},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
"},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
"},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/xedit/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"x11-apps x11-utils xbitmaps\n
"},{"location":"applications/xedit/#displayname","title":"Displayname","text":"Xedit\n
"},{"location":"applications/xedit/#path","title":"Path","text":"/usr/bin/xedit\n
"},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"application/text;\n
"},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"\"txt;log;md\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"xedit.Xedit\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xedit.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n \"icon\": \"circle_xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\": \"txt;log;md\",\n \"args\": \"\",\n \"quick\": true\n}\n
"},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
"},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xedit
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
"},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
"},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
"},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"xeyes\n
"},{"location":"applications/xeyes/#path","title":"Path","text":"/usr/bin/xeyes\n
"},{"location":"applications/xeyes/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"xeyes.XEyes\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xeyes.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"apkpackage\": \"xeyes\",\n \"icon\": \"circle_xfce4-eyes.svg\",\n \"keyword\": \"eyes\",\n \"launch\": \"xeyes.XEyes\",\n \"name\": \"xeyes\",\n \"path\": \"/usr/bin/xeyes\",\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"quick\": true\n}\n
"},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
"},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xeyes
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
"},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
"},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
"},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/xman/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
"},{"location":"applications/xman/#displayname","title":"Displayname","text":"Xman\n
"},{"location":"applications/xman/#path","title":"Path","text":"/usr/bin/xman\n
"},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"application/x-troff;application/x-troff-man;\n
"},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"\"man;roff\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"topBox.Xman\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
json source file xman.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"containerengine\": \"ephemeral_container\",\n \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n \"icon\": \"circle_xorg.svg\",\n \"keyword\": \"man,xman,help\",\n \"launch\": \"topBox.Xman\",\n \"name\": \"xman\",\n \"displayname\": \"Xman\",\n \"path\": \"/usr/bin/xman\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n \"fileextensions\": \"man;roff\",\n \"args\": \"\"\n}\n
"},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
"},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xman
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
"},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
"},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
"},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/xpad/#distribution","title":"Distribution","text":"ubuntu
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"xpad\n
"},{"location":"applications/xpad/#displayname","title":"Displayname","text":"Xpad\n
"},{"location":"applications/xpad/#path","title":"Path","text":"/usr/bin/xpad\n
"},{"location":"applications/xpad/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"xpad.xpad\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/xpad.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
"},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"json source file xpad.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"utilities\",\n \"debpackage\": \"xpad\",\n \"icon\": \"xpad.svg\",\n \"keyword\": \"xpad, note, sticky, postit\",\n \"launch\": \"xpad.xpad\",\n \"name\": \"xpad\",\n \"displayname\": \"Xpad\",\n \"path\": \"/usr/bin/xpad\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"fileextensions\": \"\",\n \"args\": \"\",\n \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n \"preruncommands\": [\n \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n ]\n}\n
"},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
"},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xpad
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
"},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
"},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
"},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.alpine
"},{"location":"applications/xterm/#distribution","title":"Distribution","text":"alpine
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"xterm sudo\n
"},{"location":"applications/xterm/#arguments","title":"Arguments","text":"\"-xrm 'XTerm*selectToClipboard:true'\"
Xterm (sudo)\n
"},{"location":"applications/xterm/#path","title":"Path","text":"/usr/bin/xterm\n
"},{"location":"applications/xterm/#acl","title":"ACL","text":"{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"xterm.XTerm\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/xterm.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"POST run command are run after the package install comman
RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"json source file xterm.d.3.0.json
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"icon\": \"circle_xterm.svg\",\n \"apkpackage\": \"xterm sudo\",\n \"keyword\": \"xterm,shell,cmd\",\n \"launch\": \"xterm.XTerm\",\n \"name\": \"xterm\",\n \"displayname\": \"Xterm (sudo)\",\n \"path\": \"/usr/bin/xterm\",\n \"rules\": {\n \"homedir\": {\n \"default\": true\n }\n },\n \"template\": \"abcdesktopio/oc.template.alpine\",\n \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n \"postruncommands\": [\n \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n ],\n \"quick\": true\n}\n
"},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
"},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application xterm
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
"},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
"},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
"},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/youtube/#distribution","title":"Distribution","text":"ubuntu
PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"firefox\n
"},{"location":"applications/youtube/#arguments","title":"Arguments","text":"\"-P youtube --class=youtube https://www.youtube.com/\"
Youtube\n
"},{"location":"applications/youtube/#path","title":"Path","text":"/usr/bin/firefox\n
"},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"\"html;xml;gif\"
\"html;xml\"
{\n \"permit\": [\n \"all\"\n ]\n}\n
"},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"Navigator.youtube\n
The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx
/usr/share/applications/firefox.desktop\n
A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.
"},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"PRE run command are run before the package install command
COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
"},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"json source file
{\n \"acl\": {\n \"permit\": [\n \"all\"\n ]\n },\n \"cat\": \"development\",\n \"debpackage\": \"firefox\",\n \"icon\": \"circle_youtube.svg\",\n \"keyword\": \"youtube,tube\",\n \"launch\": \"Navigator.youtube\",\n \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n \"name\": \"youtube\",\n \"displayname\": \"Youtube\",\n \"rules\": {\n \"homedir\": {\n \"default\": false\n }\n },\n \"host_config\": {\n \"mem_limit\": \"2G\",\n \"shm_size\": \"2G\"\n },\n \"installrecommends\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"html;xml\",\n \"fileextensions\": \"html;xml;gif\",\n \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n \"preventhomemount\": false,\n \"quick\": true,\n \"preruncommands\": [\n \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n ]\n}\n
"},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"Replace the ABCHOST var set to localhost by default to your own server ip address
ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile
source code","text":"# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN if [ -d /usr/share/icons ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi \nRUN if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"Dockerfile for application youtube
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
"},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile
to create a container image","text":"docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
"},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"If you are using containerd
as container runtime, use the ctr command line
If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address
ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.3.17
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.3.17.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.3.18
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.3.18.md is created at Wed Jan 31 2024 13:51:24 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.edge.gtk
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n openjdk21 \\\n mesa-vulkan-swrast \\ \n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
file oc.template.alpine.edge.gtk.libreoffice.md is created at Wed Jan 31 2024 14:02:02 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
file oc.template.alpine.edge.gtk.md is created at Wed Jan 31 2024 13:53:07 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal.edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.edge.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"inherite abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n mesa-dri-gallium \\\n adwaita-icon-theme \\\n libadwaita\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"inherite abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
file oc.template.alpine.libreoffice.md is created at Fri Jun 23 2023 16:46:45 GMT+0000 (Coordinated Universal Time) by make-docs.js
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update \\\n faenza-icon-theme-libreoffice \\\n libreoffice \\\n libreoffice-gtk\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine.minimal
"},{"location":"applications/abcdesktopio/oc.template.alpine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add --no-cache --update \\\n font-opensans \\\n font-adobe-100dpi \\\n font-noto \\\n font-ubuntu-nerd \\\n font-dejavu-sans-mono-nerd \\\n font-adobe-utopia-100dpi \\\n font-xfree86-type1 \\\n ttf-freefont \\\n font-ibm-type1 \\\n font-liberation \\\n font-sony-misc\n\n
file oc.template.alpine.md is created at Wed Jan 31 2024 13:51:26 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"Docker official images alpine:3.17
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.3.17.md is created at Wed Jan 31 2024 13:43:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"Docker official images alpine:3.18
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.3.18.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"Docker official images alpine:edge
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.edge.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"Docker official images alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN apk add --no-cache \\\n gnupg \\\n cups-client \\\n libpulse \\\n curl \\\n openssl \\\n xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n
file oc.template.alpine.minimal.md is created at Wed Jan 31 2024 13:43:34 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"inherit abcdesktopio/oc.template.alpine
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile
source code","text":"\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n# echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n# echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64' ]; then apk add --no-cache --update wine; fi\n\n
file oc.template.alpine.wine.md is created at Wed Jan 31 2024 14:06:58 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.debian
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.debian.gtk.md is created at Wed Jan 31 2024 13:57:34 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"inherit abcdesktopio/oc.template.debian.minimal
"},{"location":"applications/abcdesktopio/oc.template.debian/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.debian.md is created at Wed Jan 31 2024 13:51:43 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"Docker official images debian:stable-slim
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile
source code","text":"\nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \\\n && apt-get update && \\\n apt-get install -y --no-install-recommends \\\n nodejs \\\n npm \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun && npm install \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.debian.minimal.md is created at Wed Jan 31 2024 13:50:28 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.18.04.md is created at Wed Jan 31 2024 13:51:46 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.20.04.md is created at Wed Jan 31 2024 13:51:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.minimal.22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssl \\\n sudo \\\n krb5-user \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \n\n
file oc.template.ubuntu.22.04.md is created at Wed Jan 31 2024 13:51:51 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.18.04.md is created at Wed Jan 31 2024 13:59:21 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.20.04.md is created at Wed Jan 31 2024 13:57:49 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.22.04.md is created at Wed Jan 31 2024 13:57:23 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n default-jre \\\n gsfonts-x11 \\\n && rm -rf /var/lib/apt/lists/* \n\n
file oc.template.ubuntu.gtk.java.md is created at Wed Jan 31 2024 14:02:12 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"inherite abcdesktopio/oc.template.ubuntu.gtk
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search language-pack-gnome | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }') \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"inherite abcdesktopio/oc.template.ubuntu.gtk.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search language-pack-gnome | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y \\\n at-spi2-core \\\n libreoffice \\\n libreoffice-gtk3 \\\n libreoffice-style-elementary \\\n libreoffice-base-drivers \\\n libreoffice-sdbc-hsqldb \\\n libghc-hdbc-dev \\ \n && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-help | awk '{print $1 }') \\\n# && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \\ \n# $(apt-cache search myspell-dictionary | awk '{print $1 }') \\\n# && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\ \n# $(apt-cache search hyphen | awk '{print $1 }') \\\n# && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n# && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y --no-install-recommends \\\n# $(apt-cache search libreoffice-l10n | awk '{print $1 }') \\\n# && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n xfonts-base \\\n dbus-x11 \\\n && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile
source code","text":"# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gir1.2-gtk-3.0 \\\n gir1.2-gtkclutter-1.0 \\\n gir1.2-javascriptcoregtk-4.0 \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n libclutter-gtk-1.0-0 \\\n libcolord-gtk1 \\\n libgtk-3-0 \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n fonts-noto \\\n xfonts-base \\\n xfonts-encodings \\\n xfonts-scalable \\\n xfonts-utils \\\n fonts-beng \\\n fonts-beng-extra \\\n fonts-dejavu-core \\\n fonts-deva \\\n fonts-deva-extra \\\n fonts-droid-fallback \\\n fonts-freefont-ttf \\\n fonts-gargi \\\n fonts-gubbi \\\n fonts-gujr \\\n fonts-gujr-extra \\\n fonts-guru \\\n fonts-guru-extra \\\n fonts-indic \\\n fonts-kacst \\\n fonts-kacst-one \\\n fonts-kalapi \\\n fonts-knda \\\n fonts-lao \\\n fonts-lato \\\n fonts-liberation \\\n fonts-liberation2 \\\n fonts-lklug-sinhala \\\n fonts-lohit-beng-assamese \\\n fonts-lohit-beng-bengali \\\n fonts-lohit-deva \\\n fonts-lohit-gujr \\\n fonts-lohit-guru \\\n fonts-lohit-knda \\\n fonts-lohit-mlym \\\n fonts-lohit-orya \\\n fonts-lohit-taml \\\n fonts-lohit-taml-classical \\\n fonts-lohit-telu \\\n fonts-mlym \\\n fonts-nakula \\\n fonts-navilu \\\n fonts-noto-cjk \\\n fonts-noto-color-emoji \\\n fonts-noto-mono \\\n fonts-opensymbol \\\n fonts-orya \\\n fonts-orya-extra \\\n fonts-pagul \\\n fonts-sahadeva \\\n fonts-samyak-deva \\\n fonts-samyak-gujr \\\n fonts-samyak-mlym \\\n fonts-samyak-taml \\\n fonts-sarai \\\n fonts-sil-abyssinica \\\n fonts-sil-padauk \\\n fonts-smc \\\n fonts-smc-anjalioldlipi \\\n fonts-smc-chilanka \\\n fonts-smc-dyuthi \\\n fonts-smc-karumbi \\\n fonts-smc-keraleeyam \\\n fonts-smc-manjari \\\n fonts-smc-meera \\\n fonts-smc-rachana \\\n fonts-smc-raghumalayalamsans \\\n fonts-smc-suruma \\\n fonts-smc-uroob \\\n fonts-taml \\\n fonts-telu \\\n fonts-telu-extra \\\n fonts-thai-tlwg \\\n fonts-tibetan-machine \\\n fonts-tlwg-garuda \\\n fonts-tlwg-garuda-ttf \\\n fonts-tlwg-kinnari \\\n fonts-tlwg-kinnari-ttf \\\n fonts-tlwg-laksaman \\\n fonts-tlwg-laksaman-ttf \\\n fonts-tlwg-loma \\\n fonts-tlwg-loma-ttf \\\n fonts-tlwg-mono \\\n fonts-tlwg-mono-ttf \\\n fonts-tlwg-norasi \\\n fonts-tlwg-norasi-ttf \\\n fonts-tlwg-purisa \\\n fonts-tlwg-purisa-ttf \\\n fonts-tlwg-sawasdee \\\n fonts-tlwg-sawasdee-ttf \\\n fonts-tlwg-typewriter \\\n fonts-tlwg-typewriter-ttf \\\n fonts-tlwg-typist \\\n fonts-tlwg-typist-ttf \\\n fonts-tlwg-typo \\\n fonts-tlwg-typo-ttf \\\n fonts-tlwg-umpush \\\n fonts-tlwg-umpush-ttf \\\n fonts-tlwg-waree \\\n fonts-tlwg-waree-ttf \\\n fonts-urw-base35 \\\n fonts-yrsa-rasa \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n sassc \\\n optipng \\\n gtk2-engines-murrine \\\n gtk2-engines-pixbuf \\\n gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n
file oc.template.ubuntu.gtk.md is created at Wed Jan 31 2024 13:57:46 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"Docker official images ubuntu:18.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.18.04.md is created at Wed Jan 31 2024 13:46:40 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"Docker official images ubuntu:20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.20.04.md is created at Wed Jan 31 2024 13:47:38 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"Docker official images ubuntu:22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.minimal.22.04.md is created at Wed Jan 31 2024 13:47:17 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"inherit nvidia/cuda:12.0.0-base-ubuntu20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.nvidia.20.04.md is created at Wed Jan 31 2024 13:46:51 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"inherit nvidia/cuda:12.0.0-base-ubuntu22.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n gnupg \\\n software-properties-common \\\n locales \\\n cups-client \\\n libpulse0 \\\n curl \\\n xauth \\\n && apt-get clean \\\n && rm -rf /var/lib/apt/lists/ \\\n && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 | OK | KO | KO |\n# | Ubuntu Focal ^20.04 | OK | OK | OK |\n# | Ubuntu Jammy ^22.04 | OK | OK | OK |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n mkdir -p /etc/apt/keyrings && \\\n curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n apt-get update && \\\n apt-get install -y --no-install-recommends nodejs && \\\n apt-get clean && \\\n rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop if no user defined \nRUN mkdir -p /var/log/desktop && \\\n chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n
file oc.template.ubuntu.nvidia.22.04.md is created at Wed Jan 31 2024 13:46:36 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.20.04
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n wget \\\n && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n# are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n# for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes aria2 \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes binutils \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes fuseiso && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes p7zip-full policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes policykit-1 && \\\n# apt-get clean \n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n# apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n# apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n# apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y \\\n# libnss-mdns-i386 \\\n# libnss-mdns \\ \n# wine-stable && \\\n# apt-get clean \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb && \\\n# dpkg -i libfaudio0_19.07-0~bionic_amd64.deb && \\\n# rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb && \\\n# dpkg -i libfaudio0_19.07-0~bionic_i386.deb && \\\n# rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n# wget -O /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n# wget -O /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n# wget -O /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n apt-get install --yes wine && \\\n apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n apt-get clean\n\n\nRUN apt-get update && \\\n apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n apt-get clean\n\nCOPY composer/updatereg.py /composer\nCOPY composer/init.d/init.wine /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine /composer/init.d/_init.wine\nRUN mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n
file oc.template.ubuntu.wine.md is created at Wed Jan 31 2024 14:06:00 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"inherit abcdesktopio/oc.template.ubuntu.wine
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile
source code","text":"ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n apt-get install --install-recommends -y \\\n xterm \\\n wget \\\n netcat \\\n file \\\n winbind \\\n gettext \\ \n libgettextpo-dev \\\n && rm -rf /var/lib/apt/lists/* \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n libosmesa6:i386 \\\n libnss-mdns \\\n libnss-mdns:i386 \\\n libncurses5:i386 \\\n libodbc1:i386 \\\n libxext6:i386 \\\n libxi6:i386 \\\n libfreetype6:i386 \\\n libx11-6:i386 \\\n libz1:i386 \\\n libcups2:i386 \\\n liblcms2-2:i386 \\\n libglu1-mesa:i386 \\\n libxcursor1:i386 \\\n libxrandr2:i386 \\\n libxml2:i386 \\\n libgl1-mesa-dri:i386 \\\n libgl1-mesa-glx:i386 \\\n && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n rm PlayOnLinux_4.3.4.deb && \\\n rm -rf /var/lib/apt/lists/*\n\n
file oc.template.ubuntu.wine.mswindow.md is created at Wed Jan 31 2024 14:08:19 GMT+0000 (Coordinated Universal Time) by make-docs.js
"},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"#!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"NAME=\"John\"\necho \"Hi $NAME\" #=> Hi John\necho 'Hi $NAME' #=> Hi $NAME\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n
See Command substitution
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"git commit && git push\ngit commit || echo \"Commit failed\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"{: id='functions-example'}
get_name() {\n echo \"John\"\n}\n\necho \"You are $(get_name)\"\n
See: Functions
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"{: id='conditionals-example'}
if [[ -z \"$string\" ]]; then\n echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n echo \"String is not empty\"\nfi\n
See: Conditionals
","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"set -euo pipefail\nIFS=$'\\n\\t'\n
See: Unofficial bash strict mode
","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"echo {A,B}.js\n
| {A,B}
| Same as A B
| | {A,B}.js
| Same as A.js B.js
| | {1..5}
| Same as 1 2 3 4 5
|
See: Brace expansion
","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"name=\"John\"\necho ${name}\necho ${name/J/j} #=> \"john\" (substitution)\necho ${name:0:2} #=> \"Jo\" (slicing)\necho ${name::2} #=> \"Jo\" (slicing)\necho ${name::-1} #=> \"Joh\" (slicing)\necho ${name:(-1)} #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake} #=> $food or \"Cake\"\n
length=2\necho ${name:0:length} #=> \"Jo\"\n
See: Parameter expansion
STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp} # /path/to/foo\necho ${STR%.cpp}.o # /path/to/foo.o\n\necho ${STR##*.} # cpp (extension)\necho ${STR##*/} # foo.cpp (basepath)\n\necho ${STR#*/} # path/to/foo.cpp\necho ${STR##*/} # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
STR=\"Hello world\"\necho ${STR:6:5} # \"world\"\necho ${STR:-5:5} # \"world\"\n
SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/} #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE} #=> \"/path/to/\" (dirpath)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix}
Remove suffix ${FOO#prefix}
Remove prefix --- --- ${FOO%%suffix}
Remove long suffix ${FOO##prefix}
Remove long prefix --- --- ${FOO/from/to}
Replace first match ${FOO//from/to}
Replace all --- --- ${FOO/%from/to}
Replace suffix ${FOO/#from/to}
Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"# Single line comment\n
: '\nThis is a\nmulti line\ncomment\n'\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"| ${FOO:0:3}
| Substring (position, length) | | ${FOO:-3:3}
| Substring from the right |
| ${#FOO}
| Length of $FOO
|
STR=\"HELLO WORLD!\"\necho ${STR,} #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,} #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^} #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^} #=> \"HELLO WORLD!\" (all uppercase)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"| ${FOO:-val}
| $FOO
, or val
if not set | | ${FOO:=val}
| Set $FOO
to val
if not set | | ${FOO:+val}
| val
if $FOO
is set | | ${FOO:?message}
| Show error message and exit if $FOO
is not set |
The :
is optional (eg, ${FOO=word}
works)
{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"for i in /etc/rc.*; do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"for ((i = 0 ; i < 100 ; i++)); do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"for i in {1..5}; do\n echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"for i in {5..50..5}; do\n echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"cat file.txt | while read line; do\n echo $line\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"while true; do\n \u00b7\u00b7\u00b7\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"myfunc() {\n echo \"hello $1\"\n}\n
# Same as above (alternate syntax)\nfunction myfunc() {\n echo \"hello $1\"\n}\n
myfunc \"John\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"myfunc() {\n local myresult='some value'\n echo $myresult\n}\n
result=\"$(myfunc)\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"myfunc() {\n return 1\n}\n
if myfunc; then\n echo \"success\"\nelse\n echo \"failure\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $#
Number of arguments $*
All arguments $@
All arguments, starting from first $1
First argument $_
Last argument of the previous command See Special parameters.
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"Note that [[
is actually a command/program that returns either 0
(true) or 1
(false). Any program that obeys the same logic (like all base utils, such as grep(1)
or ping(1)
) can be used as condition, see examples.
[[ -z STRING ]]
Empty string [[ -n STRING ]]
Not empty string [[ STRING == STRING ]]
Equal [[ STRING != STRING ]]
Not Equal --- --- [[ NUM -eq NUM ]]
Equal [[ NUM -ne NUM ]]
Not equal [[ NUM -lt NUM ]]
Less than [[ NUM -le NUM ]]
Less than or equal [[ NUM -gt NUM ]]
Greater than [[ NUM -ge NUM ]]
Greater than or equal --- --- [[ STRING =~ STRING ]]
Regexp --- --- (( NUM < NUM ))
Numeric conditions Condition Description [[ -o noclobber ]]
If OPTIONNAME is enabled --- --- [[ ! EXPR ]]
Not [[ X ]] && [[ Y ]]
And [[ X ]] || [[ Y ]]
Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]]
Exists [[ -r FILE ]]
Readable [[ -h FILE ]]
Symlink [[ -d FILE ]]
Directory [[ -w FILE ]]
Writable [[ -s FILE ]]
Size is > 0 bytes [[ -f FILE ]]
File [[ -x FILE ]]
Executable --- --- [[ FILE1 -nt FILE2 ]]
1 is more recent than 2 [[ FILE1 -ot FILE2 ]]
2 is more recent than 1 [[ FILE1 -ef FILE2 ]]
Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"# String\nif [[ -z \"$string\" ]]; then\n echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n echo \"String is not empty\"\nfi\n
# Combinations\nif [[ X ]] && [[ Y ]]; then\n ...\nfi\n
# Equal\nif [[ \"$A\" == \"$B\" ]]\n
# Regex\nif [[ \"A\" =~ . ]]\n
if (( $a < $b )); then\n echo \"$a is smaller than $b\"\nfi\n
if [[ -e \"file.txt\" ]]; then\n echo \"file exists\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"Fruits=('Apple' 'Banana' 'Orange')\n
Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"echo ${Fruits[0]} # Element #0\necho ${Fruits[@]} # All elements, space-separated\necho ${#Fruits[@]} # Number of elements\necho ${#Fruits} # String length of the 1st element\necho ${#Fruits[3]} # String length of the Nth element\necho ${Fruits[@]:3:2} # Range (from position 3, length 2)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"Fruits=(\"${Fruits[@]}\" \"Watermelon\") # Push\nFruits+=('Watermelon') # Also Push\nFruits=( ${Fruits[@]/Ap*/} ) # Remove by regex match\nunset Fruits[2] # Remove one item\nFruits=(\"${Fruits[@]}\") # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`) # Read from file\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"for i in \"${arrayName[@]}\"; do\n echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"{: .-three-column}
","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"declare -A sounds\n
sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n
Declares sound
as a Dictionary object (aka associative array).
echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]} # All values\necho ${!sounds[@]} # All keys\necho ${#sounds[@]} # Number of elements\nunset sounds[dog] # Delete dog\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"for val in \"${sounds[@]}\"; do\n echo $val\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"for key in \"${!sounds[@]}\"; do\n echo $key\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"set -o noclobber # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit # Used to exit upon error, avoiding cascading errors\nset -o pipefail # Unveils hidden failures\nset -o nounset # Exposes unset variables\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"shopt -s nullglob # Non-matching globs are removed ('*.foo' => '')\nshopt -s failglob # Non-matching globs throw errors\nshopt -s nocaseglob # Case insensitive globs\nshopt -s dotglob # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n
Set GLOBIGNORE
as a colon-separated list of patterns to be removed from glob matches.
| history
| Show history | | shopt -s histverify
| Don't execute expanded result immediately |
| !$
| Expand last parameter of most recent command | | !*
| Expand all parameters of most recent command | | !-n
| Expand n
th most recent command | | !n
| Expand n
th command in history | | !<command>
| Expand most recent invocation of command <command>
|
| !!
| Execute last command again | | !!:s/<FROM>/<TO>/
| Replace first occurrence of <FROM>
to <TO>
in most recent command | | !!:gs/<FROM>/<TO>/
| Replace all occurrences of <FROM>
to <TO>
in most recent command | | !$:t
| Expand only basename from last parameter of most recent command | | !$:h
| Expand only directory from last parameter of most recent command |
!!
and !$
can be replaced with any valid expansion.
| !!:n
| Expand only n
th token from most recent command (command is 0
; first argument is 1
) | | !^
| Expand first argument from most recent command | | !$
| Expand last token from most recent command | | !!:n-m
| Expand range of tokens from most recent command | | !!:n-$
| Expand n
th token to last from most recent command |
!!
can be replaced with any valid expansion i.e. !cat
, !-2
, !42
, etc.
$((a + 200)) # Add 200 to $a\n
$((RANDOM%=200)) # Random number 0..200\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"(cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"python hello.py > output.txt # stdout to (file)\npython hello.py >> output.txt # stdout to (file), append\npython hello.py 2> error.log # stderr to (file)\npython hello.py 2>&1 # stderr to stdout\npython hello.py 2>/dev/null # stderr to (null)\npython hello.py &>/dev/null # stdout and stderr to (null)\n
python hello.py < foo.txt # feed foo.txt to stdin for python\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"command -V cd\n#=> \"cd is a function/alias/whatever\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"trap 'echo Error at about $LINENO' ERR\n
or
traperr() {\n echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"case \"$1\" in\n start | up)\n vagrant up\n ;;\n\n *)\n echo \"Usage: $0 {start|stop|ssh}\"\n ;;\nesac\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"source \"${0%/*}/../share/foo.sh\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"DIR=\"${0%/*}\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n -V | --version )\n echo $version\n exit\n ;;\n -s | --string )\n shift; string=$1\n ;;\n -f | --flag )\n flag=1\n ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"cat <<END\nhello world\nEND\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
read -n 1 ans # Just one character\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"| $?
| Exit status of last task | | $!
| PID of last background task | | $$
| PID of shell | | $0
| Filename of the shell script |
See Special parameters.
","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"if ping -c 1 google.com; then\n echo \"It appears you have a working internet connection\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"if grep -q 'foo' ~/.bash_history; then\n echo \"You appear to have typed 'foo' in the past\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"{: .-one-column}
docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
"},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"docker rm `docker ps -a -q -f \"status=exited\"`\n
"},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"docker rmi `docker images -q --filter \"dangling=true\"`\n
"},{"location":"cheatsheets/macos/","title":"Macos","text":"Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.
At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.
To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac
To get a shell to the LinuxKit docker-desktop
, run the docker command
docker run -it --rm --privileged --pid=host justincormack/nsenter1\n
more info: https://github.com/justincormack/nsenter1
"},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":"To restrict access to applications using authentication label, you need to define an acl
entry in the application dictionary object.
\"acl\": { \"permit\": [ \"tag\" ] },\n
For example using the application xedit
all
is a special label for everything. The xedit
application can be run for all tags.
{\n \"acl\": { \"permit\": [ \"all\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.
"},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"You can read the chapter authentification-rules to define some autenticated labels.
Update the od.config file, to add a label mylocal
if the source ip address is in local network 192.168.0.0/16
authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n 'providers': {\n 'anonymous': {\n 'displayname': 'Anonymous',\n 'caption': 'Have a look !',\n 'userid': 'anonymous',\n 'username': 'Anonymous',\n 'policies': { \n 'acl' : { 'permit': [ 'all' ] }, \n 'rules' : \n { 'rule-net-home': { \n 'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n 'expected' : True,\n 'label' : 'localnet'\n } \n } \n } \n } \n } \n } \n} \n\n
Restart the pyos service
kubectl delete pod -l run-pyos-od -n abcdesktop\n
When your services are restarted, launch your web browser
Login to your abcdesktop service and choose anonymous authentication
Check the label set during the authentication process
Goto the menu option at the right up corner, choose Settings
| User
| Session
You should read the label localnet
in the Anonymous user information.
You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.
"},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"Create a edit.json file with the content :
{\n \"acl\": { \"permit\": [ \"localhost\", \"localnet\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
To build your new image, download the make.js script file. make.js
is located in the oc.apps
repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.
Make sure that you have installed nodejs
To install make.js
command
wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n
Create icons
directory
mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n
Run the make command
node make.js -f xedit.json Dockerfile\n
You should read on standard output
myArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n acl: { permit: [ 'all' ] },\n cat: 'utilities',\n debpackage: 'x11-apps',\n icon: 'xedit.svg',\n keyword: 'text,notepad,edit,txt,editor,xedit',\n launch: 'xedit.Xedit',\n name: 'xedit',\n displayname: 'Xedit',\n path: '/usr/bin/xedit',\n template: 'abcdesktopio/oc.template.gtk',\n mimetype: 'application/text;',\n fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n
Look at the new Dockerfile
, and build the new docker image for xedit
docker build -t xedit.d .\n
You should read on standard output
[+] Building 13.0s (11/11) FINISHED \n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 2.01kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev 2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io 0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB 0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps && apt-get clean 8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.4s\n => [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.3s \n => [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.3s \n => [6/6] WORKDIR /home/balloon 0.0s \n => exporting to image 0.3s \n => => exporting layers 0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878 0.0s\n => => naming to docker.io/library/xedit.d \n
Then look at the acl label
docker inspect xedit.d | grep oc.acl\n
\"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n
The acl is stringified json object.
"},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"The xedit application is listed only if your are connected from a local network matching the previous rules.
Look for the application xedit
, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :
Launch the xedit
application
To update the acl
of xedit
application, edit the edit.json file with the content, and set nowhere
tag in acl
array :
{\n \"acl\": { \"permit\": [ \"nowhere\" ] },\n \"cat\": \"utilities\",\n \"debpackage\": \"x11-apps\",\n \"icon\": \"xedit.svg\",\n \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n \"launch\": \"xedit.Xedit\",\n \"name\": \"xedit\",\n \"displayname\": \"Xedit\",\n \"path\": \"/usr/bin/xedit\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"application/text;\",\n \"fileextensions\":\"txt;log;md\"\n}\n
Then, rebuild Dockerfile
and the docker image
of the xedit application
node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
% node make.js -f xedit.json Dockerfile\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs: [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n acl: { permit: [ 'nowhere' ] },\n cat: 'utilities',\n debpackage: 'x11-apps',\n icon: 'xedit.svg',\n keyword: 'text,notepad,edit,txt,editor,xedit',\n launch: 'xedit.Xedit',\n name: 'xedit',\n displayname: 'Xedit',\n path: '/usr/bin/xedit',\n template: 'abcdesktopio/oc.template.gtk',\n mimetype: 'application/text;',\n fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED \n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 4.19kB 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev 1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io 0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends x11-apps && apt-get clean 0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 0.0s\n => CACHED [4/6] RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi 0.0s\n => CACHED [5/6] RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi 0.0s\n => CACHED [6/6] WORKDIR /home/balloon 0.0s\n => exporting to image 0.0s\n => => exporting layers 0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903 0.0s\n => => naming to docker.io/library/xedit.d \n
Launch your web browser, and log in to your abcdesktop service
Check that xedit
is not found and not listed.
The new acl
does not allow the xedit
application to be run and show. You can now define your own rules, add set the access control list to your applications.
To update the default wallpaper file, add a ENV
variable in the desktop.envlocal
dictionary.
SET_DEFAULT_WALLPAPER
to the value like welcometoabcdesktop.png
. The file welcometoabcdesktop.png
already exists in the /composer/wallpapers
directory of your abcdesktopio/oc.user.XX.YY container image.desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'USER' : 'balloon',\n 'LOGNAME' : 'balloon',\n 'LIBOVERLAY_SCROLLBAR' : '0',\n 'UBUNTU_MENUPROXY' : '0',\n 'HOME' : '/home/balloon',\n 'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n } \n
ENV
dictionary will be use to start a new user container./composer/wallpapers
directoryNot For a development environment, add the TAG dev
FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n
To build the new docker image, run the command line
docker build -t abcdesktopio/oc.user.18.04 .\n
You should read on the standard output :
Sending build context to Docker daemon 3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
"},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"To update the default wallpaper file, add a ENV
variable in the desktop.envlocal
dictionary.
SET_DEFAULT_WALLPAPER
to the value like silas-baisch-unsplash.jpg
. The file silas-baisch-unsplash.jpg
exists in the /composer/wallpapers
directory of your new abcdesktopio/oc.user.18.04
container image.desktop.envlocal : { 'DISPLAY' : ':0.0',\n 'USER' : 'balloon',\n 'LOGNAME' : 'balloon',\n 'LIBOVERLAY_SCROLLBAR' : '0',\n 'UBUNTU_MENUPROXY' : '0',\n 'HOME' : '/home/balloon',\n 'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n } \n
ENV
dictionary will be use to start a new user container.docker
or ctr
package should be install on your Linux (optional)Start an containerised application, I choose 2048
application, for example.
Using the web browser, choose Settings
in the menu.
Choose Tasks
to list all running containers
Choose Logs
to read the stdout log file of an application
This application write on stdout
Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"You will read the sample stdout line, using a docker logs
command, open a shell on you host.
In a shell on your host, look for the container id
of the 2048
containerised application
$ docker ps -a|grep 2048\n01579054a1f6 abcdesktopio/ubuntu-2048.d:3.0 \"/composer/appli-doc\u2026\" 21 minutes ago Up 21 minutes anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n
Read the log file form the docker logs
command
$ docker logs 01579054a1f6\n
You should read on output the same lines written on the web interface
Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr
and stdout
","text":"The main log files are lastcmd.log
lastcmdenv.log
and $APPBIN.log
:
/tmp/lastcmd.log
: contains the stdout file of the init script command /composer/appli-docker-entrypoint.sh
for latest running application/tmp/lastcmdenv.log
: contains the dump of all environment variables for latest running application/tmp/$APPBIN.log
: contains stderr
and stdout
of the application $APPBIN
. $APPBIN
should be replace by the name of your binary application filename.By default, with all abcdesktop templates, applications redirect stderr
to stdout
and pipe to a tee.
${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n
By default, the /tmp
volume is shared with all containers. So to debug and read log applications, you can run a webshell
to have an access to stdout
and stderr
content.
The var $BASENAME_APP
is the name of your application
BASENAME_APP=$(basename \"$APPBIN\")\n
and APPBIN
is path
to the binary
Example with the 2048-qt
application
APPBIN=/usr/games/2048-qt\n
The /tmp
directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp
directory
balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root root 260 Dec 1 09:58 .\ndrwxr-xr-x 1 root root 4096 Dec 1 09:55 ..\n-rw-r--r-- 1 balloon balloon 102 Dec 1 09:58 2048-qt.log\nsrwxrwxrwx 1 root root 0 Dec 1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon 0 Dec 1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec 1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon 437 Dec 1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon 60 Dec 1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon 0 Dec 1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon 40 Dec 1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon 11 Dec 1 09:55 .X0-lock\ndrwxrwxrwt 2 root root 60 Dec 1 09:55 .X11-unix\nsrw------- 1 balloon balloon 0 Dec 1 09:55 .x11vnc\nballoon:~$\n
The files are /tmp/lastcmd.log
, /tmp/lastcmdenv.log
and /tmp/2048-qt.log
.
/tmp/lastcmd.log
the init command log file created by /composer/appli-docker-entrypoint.sh
/tmp/lastcmdenv.log
the last environment variables file/tmp/2048-qt.log
the command log file for the applicationDump the /tmp/2048-qt.log
, with a cat command cat /tmp/2048-qt.log
. Replace /tmp/2048-qt.log
by your own application (binary) if you choose another application.
You can run all bash commands inside the webshell
.
balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
Dump the /composer/appli-docker-entrypoint.sh
result in /tmp/lastcmd.log
, with a cat command cat /tmp/lastcmd.log
.
balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n
Dump all environment variables in file /tmp/lastcmdenv.log
.
balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n
We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.
In next chapter we will start an application from a fresh ubuntu image, to get more details.
"},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation
button.
Choose Add
as a response to the question Add abcdesktop Clipboad Helper ?
Press OKay, Got it
to confirm the abcdesktop Clipboad helper
insallation
Firefox clipboard extension runs ONLY if the hostname contains desktop
string.
The URL must matches *://*desktop*/*\"
to run the clipboard extension.
https://demo.abcdesktop.io
matches, the firefox clipboard extension is running.https://desktop.domain.io
matches, the firefox clipboard extension is running.https://abcdesktop.mydomain.local
matches, the firefox clipboard extension is running.https://demo.domain.com
does not match, the firefox clipboard extension is not running.Firefox clipboard extension syncs only text data, binary data like images are not yet supported.
Firefox clipboard extension syncs your clipboard data selected from your abcdesktop desktop to your local desktop environment.
Firefox clipboard extension syncs your local desktop environment clipboard to your abcdesktop desktop clipboard.
Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.
Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.
Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.
Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.
"},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":"Edit the mms.cfg file, and add your own website url
EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n
Add the a new line and replace https://www.domain.com
by your own web site
AllowListURLPattern=https://www.domain.com\n
"},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"Create a Dockerfile firefox-esr.d
mms.cfg
into the directory /etc/adobe
of your container imageFROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
"},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"Run the docker build command
docker build -t firefox-esr.d -f firefox-esr.d .\n
"},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"Using you web browser, log in to your abcdesktop service
Look at the twice firefox icon for Firefox
and Firefox-esr
application.
Start the application Firefox-esr
Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site
Click to the Run Adobe Flash
plugins
And Allow the Adobe Flash to run
Great, you can run the Adobe Flash plugins.
"},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and buildCitrix Receiver
for abcdesktop","text":"Citrix Workspace App
or Citrix Receiver
does not exist in official debian repository. You need to download the deb package
from the www.citrix.com website manually.
git clone https://github.com/abcdesktopio/oc.apps.git\n
Download the Citrix Receiver for Linux .deb package. Go to https://www.citrix.com/downloads/citrix-receiver/linux/receiver-for-linux-latest.html
Copy the downloaded file icaclient_13.10.0.20_amd64.deb
for example as icaclient_amd64.deb to your local oc.apps directory
cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
Sending build context to Docker daemon 29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN if [ -d /usr/share/icons ]; then cd /usr/share/icons; /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps; /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
abcdesktopio/citrix.d:dev
is ready to runDoes a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?
Let's have a look !
There are two ways to use shared memory in Linux: System V
and POSIX
.
shmget
/ shmat
/ shmdt
for the System V
method.shm_open
/ mmap
/ shm_unlink
for the POSIX
method.kubectl
command-line tool must be configured to communicate with your cluster. To install the bash and yaml files, run the command
git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
"},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"Goal: Test System V shared memory
between two containers inside the same pod
This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.
The test is successful if there is no system error and the strings are equals.
The string MemContents stored in the shared memory is : This is the way the world ends...
int exit_code = -1;\n // ftok to generate unique key \n key_t key = ftok(\"/shared/shmfile\",65);\n // shmget returns an identifier in shmid \n int shmid = shmget(key,1024,0666|IPC_CREAT);\n // shmat to attach to shared memory \n char *str = (char*) shmat(shmid,(void*)0,0);\n strcpy( str, MemContents );\n //detach from shared memory \n exit_code = shmdt(str);\n
// ftok to generate unique key \n key_t key = ftok(\"/shared/shmfile\",65);\n // shmget returns an identifier in shmid \n int shmid = shmget(key,1024,0666|IPC_CREAT);\n // shmat to attach to shared memory \n char *str = (char*) shmat(shmid,(void*)0,0);\n printf(\"%s\\n\",str);\n cmp_code = strcmp( str, MemContents );\n //detach from shared memory \n exit_code = shmdt(str);\n
To run the System V
tests
In this yaml file, sender and receiver containers share a file. This file is /shared/me
and it is the first parameter to ftok
system V call.
apiVersion: v1\nkind: Pod\nmetadata:\n name: podsysvsendershmtest\nspec:\n shareProcessNamespace: true\n restartPolicy : Never\n volumes:\n - name: shared \n emptyDir: {}\n containers:\n - name: sender\n imagePullPolicy: IfNotPresent\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/shared/me\"\n - name: receiver\n imagePullPolicy: IfNotPresent\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/shared/me\"\n
The env var FTOK_PATH
set the first parameter to ftok
system V call.
Run the test
# this test result is success\n./runtest.sh podsendershared_success.yaml\n
You can read the same string from sender to receive container.
This test is OK.
pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
"},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"In this yaml file, sender and receiver do not share file. /dummy
filename is the first parameter to ftok
system V call.
apiVersion: v1\nkind: Pod\nmetadata:\n name: podsysvsendershmtest\nspec:\n shareProcessNamespace: true\n restartPolicy : Never\n volumes:\n - name: shared \n emptyDir: {}\n containers:\n - name: sender\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/dummy\"\n - name: receiver\n image: abcdesktopio/ipctest\n command: [ \"/bin/sleep\", \"1d\" ]\n volumeMounts:\n - name: shared\n mountPath: /shared\n env:\n - name: FTOK_PATH\n value: \"/dummy\"\n
The env var FTOK_PATH
set the first parameter to ftok
system V call.
Run the test
# this test result is failed\n./runtest.sh podsendershared_failed.yaml\n
You can read that the sender write a string. The receiver does not read this string.
This test is KO.
pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n
The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers
"},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"Goal: Test Posix shared memory
between two containers inside the same pod
The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin
This test creates two containers a sender and a receiver to read a shared memory in /dev/shm
, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.
The string MemContents
stored in the shared memory is : This is the way the world ends...
/shMemEx
int fd = shm_open(BackingFile, /* name from smem.h */\n O_RDWR | O_CREAT, /* read/write, create if needed */\n AccessPerms); /* access permissions (0644) */\n if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n ftruncate(fd, ByteSize); /* get the bytes */\n\n caddr_t memptr = mmap(NULL, /* let system pick where to put segment */\n ByteSize, /* how many bytes */\n PROT_READ | PROT_WRITE, /* access protections */\n MAP_SHARED, /* mapping visible to other processes */\n fd, /* file descriptor */\n 0); /* offset: start at 1st byte */\n if ((caddr_t) -1 == memptr) report_and_exit(\"Can't get segment...\");\n\n fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n fprintf(stderr, \"backing file: /dev/shm%s\\n\", BackingFile );\n\n /* semahore code to lock the shared mem */\n sem_t* semptr = sem_open(SemaphoreName, /* name */\n O_CREAT, /* create the semaphore */\n AccessPerms, /* protection perms */\n 0); /* initial value */\n if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n /* increment the semaphore so that memreader can read */\n if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n sleep(12); /* give reader a chance */\n\n /* clean up */\n munmap(memptr, ByteSize); /* unmap the storage */\n close(fd);\n sem_close(semptr);\n shm_unlink(BackingFile); /* unlink from the backing file */\n\n
int fd = shm_open(BackingFile, O_RDWR, AccessPerms); /* empty to begin */\n if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n /* get a pointer to memory */\n caddr_t memptr = mmap(NULL, /* let system pick where to put segment */\n ByteSize, /* how many bytes */\n PROT_READ | PROT_WRITE, /* access protections */\n MAP_SHARED, /* mapping visible to other processes */\n fd, /* file descriptor */\n 0); /* offset: start at 1st byte */\n if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n /* create a semaphore for mutual exclusion */\n sem_t* semptr = sem_open(SemaphoreName, /* name */\n O_CREAT, /* create the semaphore */\n AccessPerms, /* protection perms */\n 0); /* initial value */\n if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n int i;\n for (i = 0; i < strlen(MemContents); i++)\n write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n sem_post(semptr);\n }\n\n /* cleanup */\n munmap(memptr, ByteSize);\n close(fd);\n sem_close(semptr);\n unlink(BackingFile);\n
To run the POSIX
test
kubectl create -f podposixshm.yaml \npod/podposixshm created\n
The podposixshm
pod status must be Completed
kubectl get pods podposixshm \nNAME READY STATUS RESTARTS AGE\npodposixshm 0/2 Completed 0 27s\n
The podposixshm sender log file should be :
kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file: /dev/shm/shMemEx\n
The pod/podposixshm receiver log file should be :
kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n
Delete the podposixshm
pod
kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
"},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"On a pod, we can see that the default size of /dev/shm
is 64MB, when running the df /dev/shm
command.
kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\nshm 65536 65536 0 100% /dev/shm\n
A dd
command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.
Run the dd
command
dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n
Run the df /dev/shm
command
df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\nshm 65536 65536 0 100% /dev/shm\n
Delete the shmtest
pod
kubectl delete pods shmtest\npod \"shmtest\" deleted\n
The default size is 64 MB.
"},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"Create a updateshm.yaml
file with the yaml content
apiVersion: v1\nkind: Pod\nmetadata:\n labels:\n run: updateshm\n name: updateshm\nspec:\n volumes: \n - name: volumeshm\n emptyDir:\n medium: Memory\n containers:\n - image: alpine:edge\n name: updateshm\n args: \n - 1d \n command: \n - /bin/sleep\n volumeMounts: \n - mountPath: /dev/shm\n name: volumeshm\n dnsPolicy: ClusterFirst\n restartPolicy: Never\n
Create the new pod updateshm
kubectl apply -f updateshm.yaml \npod/updateshm created\n
Execute a df /dev/shm
command inside this pods to read the size of /dev/shm
kubectl exec updateshm -- df /dev/shm\nFilesystem 1K-blocks Used Available Use% Mounted on\ntmpfs 16176264 0 16176264 0% /dev/shm\n
The size of /dev/shm
is 16176264 of 1K blocks. The new default size is 16 GB.
To set a fixed limit use the sizeLimit
in the spec.volumes
apiVersion: v1\nkind: Pod\nmetadata:\n labels:\n run: updateshm512\n name: updateshm512\nspec:\n volumes: \n - name: updateshm512\n emptyDir:\n medium: Memory\n sizeLimit: 512Mi\n containers:\n - image: alpine:edge\n name: updateshm\n args: \n - 1d \n command: \n - /bin/sleep\n volumeMounts: \n - mountPath: /dev/shm\n name: updateshm512\n dnsPolicy: ClusterFirst\n restartPolicy: Never\n
"},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":"To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop
Then, start the filemanager, your new file is located in your home directory
"},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"To download file from your abcdesktop to you local storage, just start the file manager.
Choose your file and using the right mouse button, choose the menu option Download for Desktop
as describe :
The file is downloaded by your web browser
The file is located in your Downloads
directory
Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.
"},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine
"},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"To get the installation script and the vagrant file, run the command
git clone https://github.com/abcdesktopio/vagrant.git\n
Vagrantfile.kubernetes.bastion
abcdesktop_kubernetes_bastion.sh
kmaster
vm","text":"Run the command to run the vagrant file
$ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n
This vagrant file defines a vm kmaster
:
kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n v.name = \"kmaster\"\n v.memory = 4096\n v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n
It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )
All networks are defined as private_network
to make it simplest as possible.
abcdesktop_kubernetes_bastion.sh
description","text":"abcdesktop_kubernetes_bastion.sh
takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64
:
Read step by step the abcdesktop_kubernetes_bastion.sh
content to get more details.
You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file
"},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into thekmaster
vm","text":"VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
List kube-system
pods and abcdesktop
pods
To run kubectl commands inside the master virtual machine
export KUBECONFIG=/etc/kubernetes/admin.conf \n
vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME READY STATUS RESTARTS AGE\ncoredns-64897985d-4d57p 1/1 Running 0 11h\ncoredns-64897985d-qtmkq 1/1 Running 0 11h\netcd-kmaster 1/1 Running 0 11h\nkube-apiserver-kmaster 1/1 Running 0 11h\nkube-controller-manager-kmaster 1/1 Running 0 11h\nkube-flannel-ds-gskrs 1/1 Running 0 11h\nkube-proxy-c566l 1/1 Running 0 11h\nkube-scheduler-kmaster 1/1 Running 0 11h\n
vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\ndaemonset-nginx-pt2j6 1/1 Running 0 11h\ndaemonset-pyos-zqpf7 1/1 Running 0 11h\nmemcached-od-78578c879-kstcl 1/1 Running 0 11h\nmongodb-od-5c68794bb8-wf6sm 1/1 Running 0 11h\nopenldap-od-558f7959d5-vhbln 1/1 Running 0 11h\nspeedtest-od-7b66cc656b-fh97g 1/1 Running 0 11h\n
"},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"Open your web browser to
http://[your-ip-hostname]:30443/\n
Replace [your-ip-hostname]
by the host node IP address
You should get the web page
"},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"abcdesktop
adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server
Use the credentials, to login
Philip J. Fry
fry
After the login, you should get the default desktop.
"},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"To start a shell, insert webshell
as keywords in the search text area :
ifconfig
command to list network interfaces","text":"In the web shell, run the command
$ ifconfig -a\n
This command shows the network interfaces net1
and net2
with the associated ip address
kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
"},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml
","text":"Open the abcdesktop.yaml
configuration file, and look at ldapconfig
ldapconfig : { 'planet': { 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'openldap.abcdesktop.svc.cluster.local' ],\n 'secure' : False,\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': {\n 'acls': None,\n 'rules' : {\n 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' },\n 'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
openldap.abcdesktop.svc.cluster.local
is a local ldap server running as a pod'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' }
If a user is member of 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'
then the label
tag shipcrew
is set to the user's pod
'rule-admin': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' }
If a user is member of 'cn=admin_staff,ou=people,dc=planetexpress,dc=com'
then the label
tag adminstaff
is set to the user's pod
In the abcdesktop.yaml
configuration file, and look at the desktop.policies
and the network
option
desktop.policies: {\n 'rules': {\n 'network': {\n 'shipcrew': {\n 'annotations' : {\n 'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n }\n }\n }\n },\n 'acls' : {} }\n
If a pod as the 'shipcrew'
tag, then add the network annotations
[ \n { \"name\": \"macvlan-conf-eth3\"}, \n { \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
"},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop
namespace","text":"To list pod in the abcdesktop
namespace, run the command
export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME READY STATUS RESTARTS AGE\ndaemonset-nginx-5dzjc 1/1 Running 0 151m\ndaemonset-pyos-szs8h 1/1 Running 0 151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308 3/3 Running 0 86m\nmemcached-od-78578c879-vx26h 1/1 Running 0 151m\nmongodb-od-6568f85897-tgfjb 1/1 Running 0 151m\nopenldap-od-558f7959d5-qz2kg 1/1 Running 0 151m\nspeedtest-od-76d578578d-rl8k8 1/1 Running 0 151m\n
"},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"Run the command
kubectl describe pods YOUR_POD\n
Replace YOUR_POD by your pod
root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName: fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace: abcdesktop\nPriority: 0\nNode: kmaster/10.0.2.15\nStart Time: Mon, 31 Jan 2022 16:14:16 +0000\nLabels: access_provider=planet\n access_userid=FRY\n access_username=philip_j__fry\n broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n domain=desktop\n netpol/ocuser=true\n pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n shipcrew=true\n type=x11server\n xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n
The label shipcrew=true
is set
Annotations: k8s.v1.cni.cncf.io/network-status:\n [{\n \"name\": \"cbr0\",\n \"interface\": \"eth0\",\n \"ips\": [\n \"10.244.0.12\"\n ],\n \"mac\": \"06:17:a7:0c:24:9b\",\n \"default\": true,\n \"dns\": {}\n },{\n \"name\": \"abcdesktop/macvlan-conf-eth3\",\n \"interface\": \"net1\",\n \"ips\": [\n \"192.168.29.12\"\n ],\n \"mac\": \"3a:db:a1:33:53:72\",\n \"dns\": {}\n },{\n \"name\": \"abcdesktop/macvlan-conf-eth2\",\n \"interface\": \"net2\",\n \"ips\": [\n \"10.9.1.12\"\n ],\n \"mac\": \"86:eb:43:fe:db:e7\",\n \"dns\": {}\n }]\n
The Annotations
k8s.v1.cni.cncf.io/network-status
describes the network interfaces inside the pod.
Run the command
kubectl get net-attach-def -n abcdesktop\n
root@kmaster:~# kubectl get net-attach-def -n abcdesktop\nNAME AGE\nmacvlan-conf-eth2 154m\nmacvlan-conf-eth3 154m\n
Get more details about macvlan-conf-eth3
root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName: macvlan-conf-eth3\nNamespace: abcdesktop\nLabels: <none>\nAnnotations: <none>\nAPI Version: k8s.cni.cncf.io/v1\nKind: NetworkAttachmentDefinition\nMetadata:\n Creation Timestamp: 2022-01-31T15:10:38Z\n Generation: 1\n Managed Fields:\n API Version: k8s.cni.cncf.io/v1\n Fields Type: FieldsV1\n fieldsV1:\n f:metadata:\n f:annotations:\n .:\n f:kubectl.kubernetes.io/last-applied-configuration:\n f:spec:\n .:\n f:config:\n Manager: kubectl-client-side-apply\n Operation: Update\n Time: 2022-01-31T15:10:38Z\n Resource Version: 1008\n UID: a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n Config: { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents: <none>\n
macvlan-conf-eth3
is used by the user's pod.
To list multi-policy, run the command
kubectl get multi-policy -n abcdesktop\n
root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME AGE\nmnp-permit-shipcrew 3h\n
And get description about the policy mnp-permit-shipcrew
apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n name: mnp-permit-shipcrew\n namespace: abcdesktop \n annotations:\n k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n podSelector:\n matchLabels:\n shipcrew: 'true' \n policyTypes:\n - Egress\n egress:\n - to:\n - ipBlock: \n cidr: 192.168.55.21/32\n - ipBlock:\n cidr: 192.168.55.22/32\n ports:\n - protocol: TCP\n port: 22\n
If a pod in the abcdesktop
namespace, contains a label shipcrew: 'true'
set the iptables
to permit egress to host 192.168.55.21/32
and 192.168.55.22/32
using protocol TCP
destination port 22
.
/var/lib/multi-networkpolicy/iptables/
","text":"kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
/var/lib/multi-networkpolicy/iptables/
in kmaster
root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n
A new afe82680-77b4-4bac-ad2b-8be9488402fb
exists
current.iptables
file content in the /var/lib/multi-networkpolicy/iptables/ afe82680-77b4-4bac-ad2b-8be9488402fb
root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
"},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.
kmaster
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
kmaster
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# docker images\nREPOSITORY TAG IMAGE ID CREATED SIZE\nabcdesktopio/oc.pyos dev 6bd8b8d33b73 19 hours ago 1.17GB\nrancher/mirrored-flannelcni-flannel v0.16.3 8cb5de74f107 3 days ago 59.7MB\nmemcached latest fa6cf68061c2 5 days ago 89.1MB\nk8s.gcr.io/kube-apiserver v1.23.3 f40be0088a83 6 days ago 135MB\nk8s.gcr.io/kube-controller-manager v1.23.3 b07520cd7ab7 6 days ago 125MB\nk8s.gcr.io/kube-scheduler v1.23.3 99a3486be4f2 6 days ago 53.5MB\nk8s.gcr.io/kube-proxy v1.23.3 9b7cc9982109 6 days ago 112MB\nabcdesktopio/oc.user.18.04 latest 52176672cf2e 7 days ago 1.79GB\nabcdesktopio/oc.user.ssh.18.04 dev 52176672cf2e 7 days ago 1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables latest 54838d8bbd14 10 days ago 408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin v1.0.1 ac40ce625740 12 days ago 8.1MB\nabcdesktopio/oc.nginx dev fe71c8621ef2 12 days ago 506MB\nabcdesktopio/oc.pulseaudio.18.04 dev d44997a46969 2 months ago 170MB\nabcdesktopio/oc.pulseaudio.18.04 latest d44997a46969 2 months ago 170MB\nk8s.gcr.io/etcd 3.5.1-0 25f8c7f3da61 3 months ago 293MB\nghcr.io/k8snetworkplumbingwg/multus-cni stable e6cafb5d5aa1 3 months ago 290MB\nk8s.gcr.io/coredns/coredns v1.8.6 a4ca41631cc7 3 months ago 46.8MB\nabcdesktopio/oc.cupsd.18.04 dev 095105a59722 4 months ago 745MB\nabcdesktopio/oc.cupsd.18.04 latest 095105a59722 4 months ago 745MB\nk8s.gcr.io/pause 3.6 6270bb605e12 5 months ago 683kB\nrroemhild/test-openldap latest c6b1bec361ca 10 months ago 144MB\nabcdesktopio/oc.mongo latest 802219537d3b 12 months ago 493MB\nabcdesktopio/oc.speedtest dev 298a391cfb5b 3 years ago 355MB\n
To add an application like Firefox, run the docker pull
command :
root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
"},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"Reload or open your web browser
http://[your-ip-hostname]:30443/\n
Firefox is added to your desktop dock. Start Firefox application
No rule has be defined to allow http request from your pod to a web site
All http requests are denied
The firefox application inherits from the pod's the network rules.
"},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"If you choose to use VMware instead of VirtualBox hypervisor
"},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about themacvlan
driver :","text":"Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.
"},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan
driver on vSwitch VMware","text":"The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.
When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.
Set the Mac address changes option is set to Accept
"},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":"When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.
"},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"On your worker nodes :
abcdesktop=true
to the network objectYou have to choose a nework driver for example
network driver macvlan ipvlan docker-sriov-pluginOnly the name of the network is used by abcdesktop.
Create a network with macvlan
or ipvlan
driver
In these two examples :
192.168.8.0/24
192.168.8.254
192.168.8.0/27
macvlan
:","text":"Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123
docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan
ipvlan_mode=l2 :","text":"Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.
docker network create --label type=oc.app -d ipvlan -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan
or ipvlan
):","text":"Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :
ping
the default gatewaynslookup
to query www.google.com ip addressexport GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
"},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"Update your applist.json
file and add a specific rule into the firefox application description
git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n
Specific rules entry example
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } },\n
In this example, if the current user token contains the tag label internet
when the firefox application use abcnetfirefox
and the dns 8.8.8.8
applist.json
file","text":"Edit the applist.json
file, and add rules to the application firefox
for example
The new firefox dictionary with rules :
{\n \"cat\": \"office\",\n \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n \"ENV NSS_SDB_USE_CACHE=yes\" ],\n \"debpackage\": \"\",\n \"icon\": \"firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.Firefox\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox\",\n \"showinview\": \"dock\",\n \"splash\": \"enable\",\n \"mem_limit\": \"16gb\",\n \"oomkilldisable\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n \"shm_size\": \"2gb\",\n \"usedefaultapplication\": true,\n \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n}\n
Save your changes, and run make dockerfile
, next docker build
Build and update your new firefox application
# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n
Check that the oc.rules
label in new firefox.d image
docker inspect firefox.d \n
The oc.rules
label is a string json formated
\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
"},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"Add a tag internet
to the user auth provider
od.config
file","text":"Update the ldapconfig
for planet with the new policies
dict
'policies': { 'acls': None, \n 'rules' : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ],\n 'expected' : True, \n 'label': 'internet' },\n
The complete ldapconfig
for planet is
ldapconfig : { 'planet': { 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ '192.168.7.69' ],\n 'secure' : False,\n 'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n 'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}', \n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n 'policies': { 'acls': None, \n 'rules' : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'internet' } \n } } } }\n
Restart your kubernetes pyos pod, to reload new the od.config
configuration file.
Philip J. Fry
user context.","text":"Open a web browser, go to the abcdesktop login page.
Login Accounts
Login Password Philip J. Fry. fry Hubert J. Farnsworth professorNote: the user Philip J. Fry
is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Note: the user Hubert J. Farnsworth
is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Login as the Philip J. Fry
user account.
During the user login process, pyos tag the user authentification with the 'label': 'internet'
Start the new application firefox
, the docker network for this application use the abcnetfirefox
Run the command
docker network inspect abcnetfirefox\n
abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\"
and bind the abcnetfirefox
to user container.
[\n {\n \"Name\": \"abcnetfirefox\",\n \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n \"Scope\": \"local\",\n \"Driver\": \"macvlan\",\n \"EnableIPv6\": false,\n \"IPAM\": {\n \"Driver\": \"default\",\n \"Options\": {},\n \"Config\": [\n {\n \"Subnet\": \"192.168.8.0/24\",\n \"Gateway\": \"192.168.8.254\"\n }\n ]\n },\n \"Internal\": false,\n \"Attachable\": false,\n \"Ingress\": false,\n \"ConfigFrom\": {\n \"Network\": \"\"\n },\n \"ConfigOnly\": false,\n \"Containers\": {\n \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n \"MacAddress\": \"02:42:a1:69:d0:82\",\n \"IPv4Address\": \"192.168.8.1/24\",\n \"IPv6Address\": \"\"\n }\n },\n \"Options\": {\n \"parent\": \"eno1.106\"\n },\n \"Labels\": {\n \"type\": \"oc.app\"\n }\n }\n]\n
Close the firefox application.
Logoff, to remove the user pod Philip J. Fry
.
`Hubert J. Farnsworth
user context.","text":"Login as the Hubert J. Farnsworth
user account.
Note: the user Hubert J. Farnsworth
is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
Start the new application firefox
, the docker network for this application do NOT use the abcnetfirefox
Run the command
docker network inspect abcnetfirefox\n
abcnetfirefox
description :
docker network inspect abcnetfirefox\n[\n {\n \"Name\": \"abcnetfirefox\",\n \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n \"Scope\": \"local\",\n \"Driver\": \"macvlan\",\n \"EnableIPv6\": false,\n \"IPAM\": {\n \"Driver\": \"default\",\n \"Options\": {},\n \"Config\": [\n {\n \"Subnet\": \"192.168.8.0/24\",\n \"Gateway\": \"192.168.8.254\"\n }\n ]\n },\n \"Internal\": false,\n \"Attachable\": false,\n \"Ingress\": false,\n \"ConfigFrom\": {\n \"Network\": \"\"\n },\n \"ConfigOnly\": false,\n \"Containers\": {},\n \"Options\": {\n \"parent\": \"eno1.106\"\n },\n \"Labels\": {\n \"type\": \"oc.app\"\n }\n }\n]\n
The new firefox container doesn't use the docker network abcnetfirefox
, because the Hubert J. Farnsworth
user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
The network is disabled by default.
Inspect the Hubert J. Farnsworth
firefox container
\"NetworkSettings\": {\n \"Bridge\": \"\",\n \"SandboxID\": \"\",\n \"HairpinMode\": false,\n \"LinkLocalIPv6Address\": \"\",\n \"LinkLocalIPv6PrefixLen\": 0,\n \"Ports\": {},\n \"SandboxKey\": \"\",\n \"SecondaryIPAddresses\": null,\n \"SecondaryIPv6Addresses\": null,\n \"EndpointID\": \"\",\n \"Gateway\": \"\",\n \"GlobalIPv6Address\": \"\",\n \"GlobalIPv6PrefixLen\": 0,\n \"IPAddress\": \"\",\n \"IPPrefixLen\": 0,\n \"IPv6Gateway\": \"\",\n \"MacAddress\": \"\",\n \"Networks\": {}\n }\n
The network access is disable for this application
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": false, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n
In this case, only users with the label tag internet
, can bind the network name abcnetfirefox
.
Hubert J. Farnsworth
","text":"Update the application firefox rules
Now it's time to permit network access to
Update the applist.json file :
Specific rules entry example
\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": true, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } },\n
The new firefox dictionary with network rules set with \"default\": true :
{\n \"cat\": \"office\",\n \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n \"RUN apt-get update && apt-get install --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n \"COPY policies.json /usr/lib/firefox/distribution\",\n \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n \"ENV NSS_SDB_USE_CACHE=yes\" ],\n \"debpackage\": \"\",\n \"icon\": \"firefox.svg\",\n \"keyword\": \"firefox,mozilla,web,internet\",\n \"launch\": \"Navigator.Firefox\",\n \"name\": \"Firefox\",\n \"displayname\": \"Firefox\",\n \"showinview\": \"dock\",\n \"splash\": \"enable\",\n \"mem_limit\": \"16gb\",\n \"oomkilldisable\": true,\n \"path\": \"/usr/bin/firefox\",\n \"template\": \"abcdesktopio/oc.template.gtk\",\n \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n \"legacyfileextensions\": \"htm;html;xml\",\n \"fileextensions\": \"htm;html;xml;gif\",\n \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n \"shm_size\": \"2gb\",\n \"usedefaultapplication\": true,\n \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n \"network\": { \"default\": true, \n \"internet\": { \n \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ] } } }\n}\n
Save your changes, and run make dockerfile
, next docker build
Build and update your new firefox application
# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n
Check that the oc.rules
label in new firefox.d image
docker inspect firefox.d \n
The oc.rules
label is a string json formated
\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n
Request the abcdesktop core service to update the application cache data
Replace MY_FQDN by your own hostname
export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n
You do not need to logoff the Hubert J. Farnsworth
, just close Firefox application and start it again. The new firefox container use the default network.
Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com
use the abcnetfirefox
network.
create
and destroy
application","text":"A rule support a specific bash command to notify external security equipment like firewalls, by sending create
and destroy
events.
\"rules\": { \"homedir\": { \"default\": false, \"ship\": true }, \n \"network\": { \"default\": false, \n \"ship\": { \"name\": \"abcnetfirefox\", \n \"dns\": [ \"8.8.8.8\" ], \n \"webhook\": { \n \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n } \n }\n }\n}\n
pyos
execute the command /usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
pyos
call the url /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n
Each {{ $label }}
is a mustached value.
Philip J. Fry
sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev
launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"The control plane pyos
replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}'
as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'
The control plane pyos
replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}'
as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'
To encode url parameters use the option desktop.webhookencodeparams
. Set desktop.webhookencodeparams
to True
to encode label name. The default value is False
Additional datas can be set using the desktop.webhookdict
option in od.config file
desktop.webhookdict: { \n 'api_key': 'supersecret', \n 'firewall_manage_ip': '161.105.208.129' \n}\n
The command line
/usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n
becomes
/usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
"},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":"Build image process from abcdesktopio docker registry to your private registry
"},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"Goal :
Only the name of the network is used by abcdesktop.
"},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"git clone https://github.com/abcdesktopio/webModules.git\n
"},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"Update your ui.json
file. ui.json
is located in var/webModules/transpile/config
directory.
# cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x 1 root root 4096 Feb 1 15:14 .\ndrwxr-xr-x 1 root root 4096 Feb 1 15:14 ..\n-rw-rw-r-- 1 root root 34 Feb 1 15:14 .cache.json\n-rw-rw-r-- 1 root root 2215 Feb 1 15:11 modules.json\n-rw-rw-r-- 1 root root 1044 Feb 1 15:11 ui.json\n
ui.json
is a json dictionary file
The main entry is name
, name is the project name:
{\n \"name\": \"abcdesktop.io\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#6EC6F0\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile
to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"Change for example the name to
\"name\": \"acmedesktop.io\"\n
and the
@tertiary \"value\": \"#00BCD4\"\n
Example
{\n \"name\": \"acmedesktop.io\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#00FCD4\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
"},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"Run the docker build command to build the new oc.nginx:acme
image
docker build -t oc.nginx:acme .\n
Sending build context to Docker daemon 258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n
Run the docker images
command to read the new oc.nginx
image
docker images \n\nREPOSITORY TAG IMAGE ID CREATED SIZE\noc.nginx acme 4de1755b60d7 About an hour ago 746MB\n
"},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx
by the new image oc.nginx:acme
name.
version: '3'\nservices:\n pyos:\n depends_on:\n - memcached\n - mongodb\n image: 'abcdesktopio/oc.pyos'\n networks:\n - netback\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n speedtest:\n image: 'abcdesktopio/oc.speedtest'\n networks:\n - netuser\n nginx:\n depends_on:\n - memcached\n - pyos\n image: 'oc.nginx:acme'\n ports:\n - '80:80'\n - '443:443'\n networks:\n - netuser\n - netback\n memcached:\n image: memcached\n networks:\n - netback\n mongodb:\n image: mongo\n networks:\n - netback\nnetworks:\n netuser:\n driver: bridge\n netback:\n internal: true\n
The run the docker-compose up, and start you web browser. You can read the new project name at the home page.
We define the new tertiary color as #00FCD4
in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }
Old tertiary color has been replace by #00FCD4
.
"},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":"
envsubst
command preinstalled. Common Linux systems have envsubst
preinstalledroot
. Run xedit application as root
hermes
. Run xedit application as hermes
We are starting a new containerised application from a fresh ubuntu:20.04
image and bind the X11 socket to use the pod DISPLAY.
We start a new container one as root
, and another one as current user hermes
Open a web browser and go to abcdesktop service url
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"In the example we use LDAP authentification.
The login
is Hermes Conrad
, the password is hermes
Get a shell to your host. All next command use a host shell.
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's podname
","text":"To read the hermes pod name
, MIT-MAGIC-COOKIE-1
, and uid
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n
We save this value in the pod
variable, for next usage
POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n
You should read on stdout
hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n
We save this value in the $POD
for a next usage.
XAUTH_KEY
","text":"The release 3.0 need the MIT-MAGIC-COOKIE-1
to reach the x11 DISPLAY
.
Run the command echo $XAUTH_KEY
to read the $XAUTH_KEY
value inside the hermes's pod
export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n
The XAUTH_KEY
variable is exported for a next usage.
echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid
","text":"kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n
We save this value in the PODUID
exported variable, for next usage
export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding
volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID
","text":"The default kubelet's pod directory is /var/lib/kubelet/pods/
. If you change it during the installation process replace /var/lib/kubelet/pods/
by your own directory.
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root 60 Dec 8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec 8 19:43 ..\nsrwxrwxrwx 1 1051 2051 0 Dec 8 19:43 X0\n
X0
is a file unix socket, we will bind the X0
socket in the next podapp.
home-hermes
volume location","text":"kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n
Description of this query
We save this value in the PODHOME
exported variable, for next usage
export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n
Check the value with a echo
echo $PODHOME\n/tmp/hermes-conrad\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04
","text":"Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume
/var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket:/tmp/.X11-unix
homedir
$PODHOME:/home/balloon
We use envsubst
to replace variable content in a template yaml file.
Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:
brew install gettext
The variables ${PODUID}
, ${PODHOME}
and ${XAUTH_KEY}
are exported.
Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst
Create a file podapp.template.yaml
apiVersion: v1\nkind: Pod\nmetadata:\n name: podapp\n namespace: abcdesktop\nspec:\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host ${PODUID}\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: ${PODHOME}\n # this field is optional\n type: Directory\n containers:\n - name: abccontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n env:\n - name: XAUTH_KEY\n value: ${XAUTH_KEY}\n
Run the envsubst
command to replace ${PODUID}
, ${PODHOME}
and ${XAUTH_KEY}
envsubst < podapp.template.yaml > podapp.yaml \n
Dump the podapp.yaml
file content, and check that the volumes are set with the new values.
# cat podapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n name: podapp\n namespace: abcdesktop\nspec:\n volumes:\n - name: x11socket\n hostPath:\n # directory location on host\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # directory location on host\n path: /tmp/hermes-conrad\n # this field is optional\n type: Directory\n containers:\n - name: abccontainer\n image: ubuntu:20.04\n command: /bin/sleep 1d\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n
Create the application pod
kubectl apply -f podapp.yaml \npod/podapp created\n
Check that your pod podapp
is Running
kubectl get pods podapp -n abcdesktop\nNAME READY STATUS RESTARTS AGE\npodapp 1/1 Running 0 32s\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp
","text":"You get a shell command inside the container.
kubectl exec -it podapp -n abcdesktop -- bash \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"apt-get update && apt-get install -y xauth\n
export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n
You can read on stdout
root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth: file /root/.Xauthority does not exist\nroot@podapp:/#\n
The file /root/.Xauthority
does not exist, it has been created.
For example, I choose to install the x11-apps
package
Replace x11-apps
by your own application
apt-get install -y x11-apps\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"To start the X11 application, just run it. Your DISPLAY
is set to :0.0
, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1
).
But remember you a running a container as root
, and all commands are running as root
inside the container.
Start xedit
xedit\n
Go back to your web browser.
A new x11 window xedit
should be present on your display
xedit
doesn't write any error message in the bash container.
You've get a shell inside a container to run and start any application. You can also install and start any others applications.
To clean the running pod podapp
kubectl delete pods podapp -n abcdesktop \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04
as hermes
","text":"To start a new container from ubuntu:20.04
as hermes
, we have to add the localaccount
secret volume to the previous container
Read the securityContext from the hermes
pod
export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n
Check the uidNumber
and the gidNumber
values
echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n
Create a file hermespodapp.template.yaml
apiVersion: v1\nkind: Pod\nmetadata:\n name: hermespodapp\n namespace: abcdesktop\nspec:\n securityContext:\n runAsUser: ${PODRUNASUSER}\n runAsGroup: ${PODRUNASGROUP}\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host ${PODUID}\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: ${PODHOME}\n # this field is optional\n type: Directory\n - name: localaccount\n hostPath:\n # localaccount directory location on host\n path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n # this field is optional\n type: Directory\n containers:\n - name: hermescontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n - mountPath: /var/secrets/abcdesktop/localaccount\n name: localaccount\n env:\n - name: XAUTH_KEY\n value: ${XAUTH_KEY}\n
Create your hermespodapp.yaml file from the previous template
envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n
Look at your hermespodapp.yaml
cat hermespodapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n name: hermespodapp\n namespace: abcdesktop\nspec:\n securityContext:\n runAsUser: 1051\n runAsGroup: 2051\n volumes:\n - name: x11socket\n hostPath:\n # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n # this field is optional\n type: Directory\n - name: home\n hostPath:\n # home directory location on host\n path: /tmp/hermes-conrad\n # this field is optional\n type: Directory\n - name: localaccount\n hostPath:\n # localaccount directory location on host\n path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n # this field is optional\n type: Directory\n containers:\n - name: hermescontainer\n image: ubuntu:20.04\n command: [\"/bin/sleep\"]\n args: [\"1d\"]\n volumeMounts:\n - mountPath: /tmp/.X11-unix\n name: x11socket\n - mountPath: /home/hermes\n name: home\n - mountPath: /var/secrets/abcdesktop/localaccount\n name: localaccount\n env:\n - name: XAUTH_KEY\n value: 306908f8e4d4768c7595ce5ad53479\n
Create the hermespodapp
kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n
To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc
to get a rooted shell.
Read the containerID
of the pod hermespodapp
CONTAINER=$(kubectl -n abcdesktop get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n
Get the shell with runc
command
runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n
This is correct group ID 2051
does not exit. Let's patch your file system with hermes
credentials
rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n
Now your files are updated. You can exit, and reopen a bash to your container
root@hermespodapp:/# exit\n
# runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n
The error message does not appear anymore.
Install your X11 applications as root
apt-get update && apt-get install -y x11-apps\n
Quit the root session
exit\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes
","text":"Start a new session to the pod hermespodapp
kubectl -n abcdesktop exec -it hermespodapp -- bash \n
You get a shell prompt as as hermes
. Check the hermes
homedirectory and id number
hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n
Export the var DISPLAY
and start the edit application. You don't need to create the .Xauthority
file. /home/hermes
is already mounted as a volume.
hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n
This process is running as hermes
:
hermes@hermespodapp:~$ ps -ef\nUID PID PPID C STIME TTY TIME CMD\nhermes 1 0 0 15:57 ? 00:00:00 /bin/sleep 1d\nhermes 690 0 0 16:47 pts/0 00:00:00 bash\nhermes 699 690 0 16:48 pts/0 00:00:00 xedit\nhermes 700 690 0 16:49 pts/0 00:00:00 ps -ef\n
Go back to your web browser.
A new x11 window xedit
should be present on your display
The name of the edit window is the name of your pod (hermespodapp)
.
To clean the running pod hermespodapp
kubectl delete -f hermespodapp.yaml \n
You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.
"},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"Only supported in abcdesktop release 3.0
An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.
You must have your own NFS server running with the share exported before you can use it.
"},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update theod.config
file","text":"Update the od.config
to add
auth provider
","text":"In this example, we add a label nfsuser
as a condition to mount nfs resource
In the auth provider add a dummy
condition or a memberOf
condition. All types of conditions are supported, the goal is only to get a label.
Update the od.config
file and look for the default ldapconfig
dictionnary
ldapconfig : { \n 'planet': { \n 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'dc=planetexpress,dc=com',\n 'users_ou' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': { \n 'acls': None, \n 'rules' : { \n 'rule-dummy': { \n 'conditions' : [ { 'boolean': True, 'expected' : True } ],\n 'expected' : True,\n 'label': 'nfsuser' } } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf
condition","text":"ldapconfig : { \n 'planet': { \n 'default' : True,\n 'ldap_timeout' : 15,\n 'ldap_basedn' : 'dc=planetexpress,dc=com',\n 'users_ou' : 'ou=people,dc=planetexpress,dc=com',\n 'servers' : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n 'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n 'policies': { \n 'acls': None, \n 'rules' : { \n 'rule-nfsuser': { \n 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ],\n 'expected' : True, \n 'label': 'nfsuser' } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule
in the desktop.policies
","text":"In this example, we define entries :
nfsserver
is 192.168.7.101
(can also be a FQDH)path
is /volume1/isostore
mountPath
is /mnt/iso
The mount command become like:
mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n
Update the desktop.policies
dictionnary and add a new key rules
. In the new rules
define a new entry nfsuser
.
The name of the entry MUST match a user label tag, else the mount point is not created.
In this example the label is defined as nfsuser
, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume
desktop.policies: { \n'acls' : {},\n'rules': { \n 'volumes': { \n 'nfsuser': {\n 'type': 'nfs', \n 'name': 'isostore', \n 'server': '192.168.7.101',\n 'path': '/volume1/isostore',\n 'mountPath': '/mnt/iso',\n 'readOnly': True } } } } \n
"},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config
file","text":"Save your local changes in od.config
, and update the new configmap abcdesktop-config
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
"},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos
","text":"Restart pyos
pods
kubectl delete pod -l run=pyos-od -n abcdesktop\n
pod \"pyos-od-5586b88767-64jwt\" deleted\n
"},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad
and list nfs files","text":"Open the url http://localhost:30443
, in your web browser, to start a simple user's pod.
http://localhost:30443\n
Hermes Conrad
for example. Hermes Conrad
is member of admin_staff
. nfsuser
is listed/mnt/iso
directory contentYou can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section
"},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"Let talk about a common features with multiple groups and user securityContext
on pods
ou=people,dc=planetexpress,dc=com
gidNumber
and uidNumber
supplementalGroups
supportkubernetes
supplementalGroups
support","text":"Let's create a yaml file to define pod with securityContext
and supplementalGroups
apiVersion: v1\nkind: Pod\nmetadata:\n name: security-context-supplementalgroups-demo\nspec:\n securityContext:\n runAsUser: 1000\n runAsGroup: 3000\n supplementalGroups: [2000,4000,5000,6000]\n volumes:\n - name: sec-ctx-vol\n emptyDir: {}\n containers:\n - name: sec-ctx-demo\n image: busybox:1.28\n command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n volumeMounts:\n - name: sec-ctx-vol\n mountPath: /data/demo\n securityContext:\n allowPrivilegeEscalation: false\n
Create the pod security-context-supplementalgroups-demo
$ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n
The pod is created
pod/security-context-supplementalgroups-demo created\n
Test the id
command, you get the list uid=1000
gid=3000
groups=2000,4000,5000,6000
$ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n
Run the group command inside the pod
$ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n
The result exit
with code 1
. The groups do not exist in /etc/group
3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n
This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid
, gid
and supplementalgroups
are read from posixAccount
and posixGroup
in the directory service.
.spec.securityContext
from a pod","text":"kubectl command to read .spec.securityContext
kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n
You read as output
{\n \"runAsGroup\": 3000,\n \"runAsUser\": 1000,\n \"supplementalGroups\": [\n 2000,\n 4000,\n 5000,\n 6000\n ]\n}\n
"},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"The complete ldif file can be downloaded at the end of this page.
The ldif set :
people
: ou=people,dc=planetexpress,dc=com
groups
: ou=groups,dc=planetexpress,dc=com
Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com
- gidNumber: 1036
- uid: hermes
- uidNumber: 1035
Create a posixGroup for hermes
: cn=hermes,ou=groups,dc=planetexpress,dc=com
posixGroup
top
hermes
1036
Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com
accountant
18430
hermes
Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com
20467
fry
hermes
Login to abcdesktop as Hermes Conrad
account
Inside the user pod, the unix group file contains :
cat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n
This is correct.
The user's pod is defined with a securityContext
In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27
by your own pod's name
kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext' \n
You can read on stdout
{\n \"runAsGroup\": 1036,\n \"runAsUser\": 1035,\n \"supplementalGroups\": [\n 20467,\n 18430\n ]\n}\n
This is correct. supplementalGroups
defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com
Inside the user pod run the id
command
hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n
This is correct.
"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"The default home directory in od.config
is a volume hostPath
set to /tmp
desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n
On your host server, get a shell with as root account, create a file humansfile
with restricted access to member of humans
group.
cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n
Check the owner and group of the new file humansfile
ls -la humansfile\n----rwx--- 1 root 20467 6 nov. 23 17:16 humansfile\n
Check inside the user pod check that hermes
account can write data in the new file humansfile
.
This is correct hermes
is member of humans
group.
hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n
This is correct.
The user's pod is defined with a securityContext
'securityContext': {\n 'runAsUser': 1035,\n 'runAsGroup': 1036,\n 'supplementalGroups': [20467, 18430] \n}\n
This is correct. supplementalGroups
defines the others groups from LDAP
Inside the user pod run the id
command
hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n
This is correct.
"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"The default home directory in od.config
is a volume hostPath
set to /tmp
desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n
On your host server, using a root account, create a file humansfile
with restricted access to member of humans
group.
cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n
Check the owner and group
ls -la humansfile\n----rwx--- 1 root 20467 6 nov. 23 17:16 humansfile\n
Check inside the user pod check that hermes
account can to write data in file humansfile
, because hermes
is member of humans
group.
hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n
This is correct.
We describe a common features with multiple groups and user securityContext
on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.
To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.
version: 1\n=======\nhermes:~$ \n
This is correct.
We describe a common features with multiple groups and user securityContext
on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.
To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.
version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
"},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":""},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":"docker
package installed Download the ui.json
file. ui.json
is located in webModules/transpile/config
directory of webModules
abcdesktop's repository.
mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n
ui.json
is a json dictionary file
The main entres are :
name
, name is the name of your project.projectNameSplitedHTML
, is the animated span
name of your project.<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>
<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
{\n \"name\": \"abcdesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#6EC6F0\"\n },\n {\n \"name\": \"@quaternary\",\n \"value\": \"#1E1E1E\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\",\n \"urlusermanual\": \"https://www.abcdesktop.io/\",\n \"urlusersupport\": \"https://www.abcdesktop.io/\",\n \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"Change for example the name
of the project, and projectNameSplitedHTML
to
\"name\": \"acmedesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n
Example
{\n \"name\": \"acmedesktop.io\",\n \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n \"colors\": [\n {\n \"name\": \"@primary\",\n \"value\": \"#474B55\"\n },\n {\n \"name\": \"@secondary\",\n \"value\": \"#2D2D2D\"\n },\n {\n \"name\": \"@tertiary\",\n \"value\": \"#18974C\"\n },\n {\n \"name\": \"@quaternary\",\n \"value\": \"#1E1E1E\"\n },\n {\n \"name\": \"@svgColor\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@danger\",\n \"value\": \"#CD3C14\"\n },\n {\n \"name\": \"@success\",\n \"value\": \"#32C832\"\n },\n {\n \"name\": \"@info\",\n \"value\": \"#527EDB\"\n },\n {\n \"name\": \"@warning\",\n \"value\": \"#FFCC00\"\n },\n {\n \"name\": \"@light\",\n \"value\": \"#FFFFFF\"\n },\n {\n \"name\": \"@dark\",\n \"value\": \"#666666\"\n },\n {\n \"name\": \"@blue\",\n \"value\": \"#4BB4E6\"\n },\n {\n \"name\": \"@green\",\n \"value\": \"#50BE87\"\n },\n {\n \"name\": \"@purple\",\n \"value\": \"#A885D8\"\n },\n {\n \"name\": \"@pink\",\n \"value\": \"#FFB4E6\"\n },\n {\n \"name\": \"@yellow\",\n \"value\": \"#FFD200\"\n }\n ],\n \"urlcannotopensession\": \"/identification/site/\",\n \"urlusermanual\": \"https://www.abcdesktop.io/\",\n \"urlusersupport\": \"https://www.abcdesktop.io/\",\n \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile
to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile
to build the new image","text":"Dockerfile
#\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
"},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"Run the docker build command to build the new oc.nginx:acme
image
docker build -t oc.nginx:acme .\n
# docker build -t oc.nginx:acme .\nSending build context to Docker daemon 21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.0 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.0\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\nfatal: not a git repository: /var/webModules/../../.git/modules/var/webModules\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.0\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\" maintainer=\"acmedesktop\" version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n
Run the docker images
command to read the new oc.nginx
image
docker images \n\nREPOSITORY TAG IMAGE ID CREATED SIZE\noc.nginx acme b5449d85393f 2 minutes ago 685MB\n
"},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"docker image save oc.nginx:acme -o oc.nginx.acme\n
"},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme
in k8s.io
namespace for containerd
","text":"The oc.nginx.acme
not is listed in the k8s.io
namespace.
Run the ctr
command line to import oc.nginx.acme
ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n
Check that your new image is listed
ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme application/vnd.docker.distribution.manifest.v2+json sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64 io.cri-containerd.image=managed \n
"},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"Update your own abcdesktop.yaml
file to replace the default image abcdesktopio/oc.nginx:3.0
by the new container image oc.nginx:acme
name.
containers:\n - name: nginx\n imagePullPolicy: Always\n image: abcdesktopio/oc.nginx:3.2\n
Replace :
imagePullPolicy: Always
by imagePullPolicy: Never
image: abcdesktopio/oc.nginx:3.2
by image: oc.nginx:acme
containers:\n - name: nginx\n imagePullPolicy: Never\n image: oc.nginx:acme\n
Apply the new abcdesktop.yaml
file
kubectl apply -f abcdesktop.yaml \n
The deployment.apps/nginx-od
is configured
clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n
Start you web browser. You can read the new project name at the home page. After login you get the new color.
You have updated the html web page for abcdesktop release 3.X
"},{"location":"core/memcached/","title":"Memcached","text":"The memcached container comes from the public docker registry. This service is attend to the netback network.
memcached store pods and containers message during the create process.
"},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"Messages stored into memcache
status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.
The mongodb container comes from the public docker registry. This service is attend to the netback network.
"},{"location":"core/mongodb/#collections","title":"Collections","text":"abcdesktop.io uses the colections mongodb to store
[ \n \"keyboard\",\n \"frontendjs.filemanager\",\n \"Mail.Thunderbird\",\n \"libreoffice.libreoffice-calc\",\n \"libreoffice.libreoffice-writer\",\n \"Navigator.Firefox\",\n \"gimp.Gimp\",\n \"gnome-terminal.Gnome-terminal\"\n]\n
"},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"The object's format is :
{\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
The method getCollection, is a ligth way to get a collection on the fron-end side.
For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.
getCollection('loginHistory', function(msg) {\n if (msg.status === 200) {\n var history = msg.result;\n loginHistory = history;\n buildHtmlTable(history);\n }\n })\n
"},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).
"},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":"The static files (html, css, js) are stored in the local /var/webModules directory.
"},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":"http://$my_proxy:$api_service_tcp_port;
http://$target:$spawner_service_tcp_port;
http://$target:$ws_tcp_bridge_tcp_port/;
http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;
http://$target:$broadcast_tcp_port;
The /etc/nginx/get.targetmap.lua read the jwt_token
and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key
and the jwt_desktop_payload_private_key
It uses a targetmap (dict) as first cache level.
lua_shared_dict targetmap 1m;\n
Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.
"},{"location":"core/ocuser/","title":"The POD User","text":"After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.
"},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"The pod user runs by default a container with the graphical image : the oc.user.18.04.
A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage
and desktop.printerimage
].
All processes are running as the user named balloon
, because none of theme need to run as root
.
The userid and the guid are 4096
.
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n
Supervisor is the parent of all running process
docker-entrypoi---supervisord-+-Xvnc\n |-node---10*[{node}]\n |-4*[nodejs---10*[{nodejs}]]\n |-nodejs---6*[{nodejs}]\n |-nodejs-+-bash---pstree\n | `-11*[{nodejs}]\n |-openbox\n `-xsettingsd\n
"},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"TigerVNC is a high-performance, platform-neutral implementation of VNC
(Virtual Network Computing
), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.
Starts parameters
command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n
The default DISPLAY is :0. Xvnc
listen on unix socket file /tmp/.x11vnc
.
Openbox is the window manager, it supports extensive standards support.
Openbox is patched with few line to send SIG_USR1
and SIG_USR2
messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.
This patch add notification when X11/window change :
The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)
#define SIG_MANAGED_WINDOW SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n
Openbox is started by supervisord using the command :
command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
"},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.
ws-tcp-bridge is started by supervisord using the command :
/composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
"},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :
spawner-service.js is started by supervisord using the command :
command=nodejs /composer/node/spawner-service/spawner-service.js\n
"},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :
command=nodejs /composer/node/printer-service/printer-service.js\n
"},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"Broadcast-service.js allows to broadcast messages between all user sharing the same session.
Broadcast-service.js is started by supervisord using the command :
command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
"},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.
http.createServer(function(req, res) {\n if (req.method === 'POST') {\n uploadFile( req, res );\n } \n else if (req.method === 'GET') {\n respondFile( req, res );\n }\n}).listen(8080, function() {\n console.log('Listening for requests');\n});\n
File-service.js is started by supervisord using the command :
command=nodejs /composer/node/file-service/file-service.js\n
"},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.
file etc/pulse/default.pa
load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n
Pulseaudio is started by supervisord using the command :
command=/usr/bin/pulseaudio\n
"},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:
Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n
Xsettingsd is started by supervisord using the command.
command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
"},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.
+-------------------+\n| oc.user.18.04 | (abcdesktop.io custom software component)\n+---------+---------+\n |\n+---------+---------+\n| oc.software.18.04 | (abcdesktop.io ubuntu software component)\n+---------+---------+\n |\n+---------+---------+\n| oc.ubuntu.18.04 | (abcdesktop.io ubuntu service)\n+-------------------+\n |\n+---------+---------+\n| ubuntu:18.04 | (official ubuntu images from dockerhub)\n+-------------------+\n
To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.
docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04 -f oc.user.18.04 .\n
To do it automaticly, clone composer/dockerbuild and run the Makefile
git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
"},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:
oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:
oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:
"},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"# Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install \nRUN cd /composer/node/file-service && npm install\nRUN cd /composer/node/printer-service && npm install\nRUN cd /composer/node/spawner-service && npm install \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
"},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"# change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN chown -R $BUSER:$BUSER /var/spool/cups && \\\n chown -R $BUSER:$BUSER /var/spool/cups-pdf && \\\n chown -R $BUSER:$BUSER /var/log/cups && \\\n chown -R $BUSER:$BUSER /var/cache/cups && \\\n chown -R $BUSER:$BUSER /etc/cups/printers.conf && \\\n chown -R $BUSER:$BUSER /var/run/cups/\n
"},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"Datas to these tcp ports are routed by nginx
PULSEAUDIO_HTTP_PORT 4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT 6081\nRESERVED_FOR_NEXT_VERSION 29780\nXTERM_TCP_PORT 29781\nFILE_SERVICE_TCP_PORT 29783\nBROADCAST_SERVICE_TCP_PORT 29784\nRESERVED FOR CUPSD 29785\nSPAWNER_SERVICE_TCP_PORT 29786\n
"},{"location":"core/pyos/","title":"pyos","text":"oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :
The speedtest container comes from the public docker registry.
"},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.
"},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
A sample API
Base URLs:
GET /
Get file from the home directory
Example responses
403 Response
"},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"Status Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"POST /
Upload a file at a given path
Body parameter
Example responses
200 Response
"},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"DELETE /
Remove a given file wich is present in home directory
Body parameter
{\n \"myFilename\": \"string\"\n}\n
"},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none Example responses
200 Response
"},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 400
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 403
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 500
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"GET /directory/list
List files in a given directory
"},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
A sample API
Base URLs:
GET /version
Get User container version
Example responses
200 Response
{\n \"date\": null,\n \"commit\": \"string\",\n \"version\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"POST /launch
Used to run builtin application process
Body parameter
{\n \"command\": \"string\",\n \"args\": [\n \"string\"\n ]\n}\n
"},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"POST /setAudioQuality
Set the audio quality
Body parameter
{\n \"sink\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"POST /playAudioSample
Play a sample audio
Example responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"PUT /configurePulse
Configure pulse audio for Janus
Body parameter
{\n \"destinationIp\": \"string\",\n \"port\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"POST /broadcastwindowslist
Emit a broadcast with window list as data
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"POST /clipboardsync
Synchronize X11 and gtk clipboard
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"POST /setDesktop
Store a data as json file in desktop
Body parameter
{\n \"key\": \"string\",\n \"value\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"GET /getDesktop
Get a data stored as json file
"},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true noneExample responses
200 Response
{\n \"code\": 0,\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"GET /getmimeforfile
Get a mime for a given filename
"},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true noneExample responses
200 Response
{\n \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"GET /filesearch
Used for list files by dock
"},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true noneExample responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"file\": \"string\",\n \"mime\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"POST /generateDesktopFiles
Build desktop files to run containerized applications
Body parameter
{\n \"list\": [\n {\n \"mimetype\": \"string\",\n \"path\": \"string\",\n \"executablefilename\": \"string\",\n \"icon\": \"string\",\n \"name\": \"string\",\n \"launch\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"GET /getappforfile
Allow to get the app necessary
Example responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"command\": \"string\",\n \"args\": \"string\"\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"GET /about
Get system informations
Example responses
200 Response
{\n \"hostname\": \"string\",\n \"ipaddr\": \"string\",\n \"plateform\": \"string\",\n \"arch\": \"string\",\n \"release\": \"string\",\n \"cpu\": \"string\",\n \"clientipaddr\": \"string\",\n \"country\": \"string\",\n \"language\": \"string\",\n \"build\": \"string\",\n \"POD_NAMESPACE\": \"string\",\n \"POD_NAME\": \"string\",\n \"NODE_NAME\": \"string\",\n \"POD_IP\": \"string\",\n \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"GET /getSettings
Get configuration for settings window
Example responses
200 Response
{\n \"code\": 0,\n \"data\": [\n {\n \"tab\": \"string\",\n \"enabled\": true\n }\n ]\n}\n
"},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"POST /setBackgroundColor
Change the background color
Body parameter
{\n \"color\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"POST /setBackgroundImage
Set the background image
Body parameter
{\n \"imgName\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": {\n \"color\": \"string\",\n \"subData\": {\n \"code\": 0,\n \"data\": \"string\"\n }\n }\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"POST /setDefaultImage
Set the default image as background
Example responses
200 Response
"},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none noneStatus Code 404
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"GET /getwindowslist
Get window list
Example responses
200 Response
"},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"Status Code 200
Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"POST /activatewindows
Activate windows
Body parameter
{\n \"windowsid\": [\n 0\n ]\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"POST /closewindows
Close windows
Body parameter
{\n \"windowsid\": [\n 0\n ]\n}\n
"},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"POST /placeAllWindows
Place and resize all windows
Example responses
200 Response
{\n \"code\": 0,\n \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"{\n \"code\": 0,\n \"data\": \"string\"\n}\n\n
"},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"{\n \"code\": 0,\n \"data\": \"string\"\n}\n\n
All operations completed with success
"},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"{\n \"code\": 0,\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"{\n \"code\": 0,\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"{\n \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"{\n \"code\": 0,\n \"data\": [\n {\n \"command\": \"string\",\n \"args\": \"string\"\n }\n ]\n}\n\n
"},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.
abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io
This article is just an update from Fabian St\u00e4ber work.
"},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.
Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.
"},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
.
The plugin directory can be configured with the kubelet's --volume-plugin-dir
parameter, run ps aux | grep kubelet
to learn the location of the plugin directory on your system (see [#1][9]). The cifs
script must be located in a subdirectory named abcdesktop~cifs/
. The directory name abcdesktop~cifs/
will be mapped to the Flexvolume driver name abcdesktop/cifs
.
On the Kubernetes master and on each Kubernetes node run the following commands:
VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n
The cifs
script requires a few executables to be available on each host system:
mount.cifs
, on Ubuntu this is in the cifs-utils package.jq
, on Ubuntu this is in the jq package.mountpoint
, on Ubuntu this is in the util-linux package.base64
, on Ubuntu this is in the coreutils package.apt-get install cifs-utils jq util-linux coreutils\n\n
To check if the installation was successful, run the following command:
VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n
It should output a JSON string containing \"status\": \"Success\"
. This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.
In this example, we use a Microsoft Active Directory as a LDAP Server.
CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode
Add a new policy to add a label TAG
during the user's authentification process.
\n# Add an explicit authmanagers\nauthmanagers: { \n 'explicit': {\n 'show_domains': True,\n 'default_domain': 'AD',\n 'providers': {\n 'AD': { \n 'config_ref': 'adconfig', \n 'enabled': True\n }\n }\n }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': { 'default' : True, \n 'ldap_timeout' : 15,\n 'ldap_protocol' : 'ldap',\n 'ldap_basedn' : 'DC=ad,DC=domain,DC=local',\n 'ldap_fqdn' : '_ldap._tcp.ad.domain.local',\n 'domain' : 'AD',\n 'domain_fqdn' : 'AD.DOMAIN.LOCAL',\n 'servers' : [ '192.168.7.12' ],\n 'kerberos_realm': 'AD.DOMAIN.LOCAL',\n 'policies' : { 'acls': None,\n 'rules' : { 'rule-domainuser' : {\n 'conditions' : [ { 'primarygroupid': '513', 'expected' : True } ],\n 'expected' : True,\n 'label' : 'domainuser' } \n} } } } } } }\n\n
In this example :
DOMAIN USER
group, we check that the user's primaryGroupID
is equal to 513
primaryGroupID
is equal to 513
the authentification process add the label domainuser
Then in the same od.config file, add rules to the desktop object to match this label domainuser
desktop.policies: { 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n 'acls' : {} }\n\n
In this example :
domainuser
, then the user attribut homeDir
is mounted to the homeDirectory
by the CIFS flexvolume plugin.kubectl apply -f abcdesktop.yml\n
Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.
Run authentification on the Microsoft Active Direcotry Service or on your Samba server
Start the File Manager application. In this example, the homeDir
is set to U:
, the mount entry become the letter U
.
Click on the homeDir
to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex
contains a file ```NAS-file.ods'
Logs files are stored in host directory /var/log/abcdesktop/cifs
# ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c. 1 12:00 ..\n-rw-r--r-- 1 root root 288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root 832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c. 1 14:25 error.alex.json\n-rw-r--r-- 1 root root 834 d\u00e9c. 1 14:25 error.alex.log\n-rw-r--r-- 1 root root 50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root 44 d\u00e9c. 22 12:20 umount.counter\n
Check the file sAMAccountName.log, cifs.log
If there is an error, look at the error.$sAMAccountName.json
and error.$sAMAccountName.log
Example
-rw-r--r-- 1 root root 1264 d\u00e9c. 1 14:25 error.alex.json\n-rw-r--r-- 1 root root 834 d\u00e9c. 1 14:25 error.alex.log\n
Run mount command
mount
In this example :
192.168.7.101
is the IP Address of the NAS server//192.168.7.101/alex
is the shared ressourcealex
is the sAMAccountName# mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n
Check that the kubernetes secrets exist
kubectl get secrets -n abcdesktop\nNAME TYPE DATA AGE\nabcdesktopjwtdesktoppayload Opaque 2 65d\nabcdesktopjwtdesktopsigning Opaque 2 65d\nabcdesktopjwtusersigning Opaque 2 65d\nauth-cifs-alex-flexvol-cifs-homedir abcdesktop/cifs 4 10m\nauth-ldif-alex abcdesktop/ldif 11 10m\n
"},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"File need to be written
"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index b330d4f2c..b0a12bb2b 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ